原文:C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享

曾经我做office,不想依赖别人dll,就使用了

Type.GetTypeFromProgID 可以根据 一个 ID 获得office的操作对象了,当然你也可以获得其他的操作对象,这个id就像一个密码。

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

我AY的教程是按照我 高中的思维水平来理解的,如果有问题,还请指出。

写一个控制台或者 WPF程序

新建一个测试用的 类型

C#
        public class AyClass1
{
public string P1 { get; set; }
public int P2 { get; set; }
public int M1()
{
return P2 * 2;
}
public int M2(int t)
{
return P2 * t;
} public void M3()
{ }
}
C#
      AyClass1 cls = new AyClass1();
RuntimeTypeHandle _r0 = cls.GetType().TypeHandle;
RuntimeTypeHandle _r1 = Type.GetTypeHandle(cls);
Console.WriteLine(_r0.Equals(_r1)); var _t = Type.GetTypeFromHandle(_r0);
Console.WriteLine(_t==typeof(AyClass1));

看完上面一段代码,能有什么用呢, 我也没发现啥,  从类型实例获得Type,从 类获得Type,从类型句柄获得Type

C#
RuntimeTypeHandle FromObject = Type.GetTypeHandle(cls);
RuntimeTypeHandle FromType = typeof(AyClass1).TypeHandle; Console.WriteLine("\nFromObject.Value: {0}", FromObject.Value);
Console.WriteLine("FromObject.GetType(): {0}",FromObject.GetType()); Console.WriteLine("Get the type back from the handle..."); Console.WriteLine("Type.GetTypeFromHandle(FromObject): {0}",
Type.GetTypeFromHandle(FromObject));
Console.WriteLine("\nFromObject.Equals(FromType): {0}",
FromObject.Equals(FromType)); Console.WriteLine("\nFromType.Value: {0}", FromType.Value);
Console.WriteLine("FromType.GetType(): {0}", FromType.GetType()); Console.WriteLine("Get the type back from the handle..."); Console.WriteLine("Type.GetTypeFromHandle(FromType): {0}",
Type.GetTypeFromHandle(FromType));

也就是说,从类型实例,还是从 类型 获得类型句柄都是同一个对象的。

DUDU博客:查看

Type 是一个表示类型的抽象类;RuntimeType 是 Type 针对载入类型信息的具体实现;RuntimeTypeHandle 则是类型唯一的抽象句柄

有了Type,你就可以创建实例,然后调用使用了。

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

返回一个实例

C#
            var _1 = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(AyClass1)) as AyClass1;
_1.P2 = 10;
var _2 = _1.M2(10);
MessageBox.Show(_2.ToString());//应该返回100

竟然说到这里了,看下反射

新建Test1类库,客户端引用下

C#
using System;

namespace Test1
{
public class Class1
{
public string P1 { get; set; }
public int M1(int t)
{
return 10 * t;
} public void M3()
{
Console.WriteLine(P1+" M3被执行");
}
}
}

C#
 System.Runtime.Remoting.ObjectHandle handle = Activator.CreateInstance("Test1", "Test1.Class1");
Object p = handle.Unwrap();
Type t = p.GetType();
System.Reflection.PropertyInfo prop = t.GetProperty("P1");
if (prop != null)
prop.SetValue(p, "AY"); System.Reflection.MethodInfo method = t.GetMethod("M3");
method.Invoke(p, null);

也可以这样创建object实例

C#
   Type t = Type.GetType("Test1.Class1,Test1");
Object p = Activator.CreateInstance(t);

那如果有构造函数的呢?

新增测试2

C#
    public class Class2
{
public Class2(string hello)
{
this.P1 = hello;
}
public string P1 { get; set; }
public int M1(int t)
{
return 10 * t;
} public string M3()
{
return P1 + " M3被执行";
}
}

添加执行代码

C#
Type t = Type.GetType("Test1.Class2,Test1");
Object p = Activator.CreateInstance(t, "aaronyang:");
System.Reflection.MethodInfo method = t.GetMethod("M3");
var _t = method.Invoke(p, null);
MessageBox.Show(_t.ToString());

那么同样,如果方法有重载?泛型等,这种写不完的,具体,自己研究。

去掉类库的引用,拷贝生成的dll到 客户端的生成目录下,你知道了,不引用怎么创建类型调用

C#
    Type[] types = System.Reflection.Assembly.LoadFile(Environment.CurrentDirectory + "\\Test1.dll").GetTypes();
var type = types.FirstOrDefault(x => x.Name == "Class2");
if (type != null)
{
Object p = Activator.CreateInstance(type, "aaronyang:");
System.Reflection.MethodInfo method = type.GetMethod("M3");
var _t = method.Invoke(p, null);
MessageBox.Show(_t.ToString());
}

效果同上。

你也可以这样写,效果同上

C#
 System.Reflection.Assembly assembly = System.Reflection.Assembly.Load("Test1");
if (assembly != null)
{
Type type = assembly.GetType("Test1.Class2");
if (type != null)
{
Object p = Activator.CreateInstance(type, "aaronyang:");
System.Reflection.MethodInfo method = type.GetMethod("M3");
var _t = method.Invoke(p, null);
MessageBox.Show(_t.ToString());
}
}

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

好了,附加参考

Assembly 通过此类可以加载操纵一个程序集,并获取程序集内部信息

EventInfo 该类保存给定的事件信息

FieldInfo 该类保存给定的字段信息

MethodInfo 该类保存给定的方法信息

MemberInfo 该类是一个基类,它定义了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多个公用行为

Module 该类可以使你能访问多个程序集中的给定模块

ParameterInfo 该类保存给定的参数信息      

PropertyInfo 该类保存给定的属性信息

object[] typeAttributes=type.GetCustomAttributes(false); 自定义特性

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

推荐您阅读更多有关于“C#,”的文章

C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享的更多相关文章

  1. C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享

    原文:C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享 1 : C# Assembly.GetEntryAssembly().GetName().Version. ...

  2. AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享

    原文:AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...

  3. AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享

    原文:AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...

  4. Mac 桌面软件开发基础问答

    1> Mac OS X平台下的桌面软件是由什么编程语言处理 答: 由Objective-C, swift编程语言处理 2> Mac OS X平台下的桌面软件是由什么框架构建 答: 由Coc ...

  5. nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞

    第0.1节 HTML5和桌面软件开发的碰撞 当我们谈论桌面软件开发技术的时候,你会想到什么?如果不对技术本身进行更为深入的探讨,在我的世界里,有这么多技术概念可以被罗列出来(请原谅我本质上是一个Win ...

  6. AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享

    原文:AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享 ====================www.ayjs.net       杨洋    wpfui.com      ...

  7. AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享

    原文:AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享 ====================www.ayjs.net       杨洋    wpfui.com      ...

  8. 基于Qt Designer和PyQt5的桌面软件开发--环境搭建和入门例子

      本文介绍了如何使用技术栈PyCharm+Qt Designer+PyQt5来开发桌面软件,从环境搭建.例子演示到对容易混淆概念的解释.文中用到的全部软件+代码下载链接为:https://url39 ...

  9. 拿到这份 Java、C++ 软件开发完整学习路线图,我面试再也没挂过..

    大家好,我是柠檬. 柠檬哥作为一个普通大学.非计算机专业,自学后端技术进入腾讯做后端开发工作,我自己也是非科班自学计算机成功转行软件开发(有想听柠檬哥转行之路经历的吗,可以留言告诉我,人多就写写),体 ...

随机推荐

  1. 多校第六场 HDU 4927 JAVA大数类+模拟

    HDU 4927 −ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊.如今对组合算比較什么了-- import java ...

  2. <LeetCode OJ> 62. / 63. Unique Paths(I / II)

    62. Unique Paths My Submissions Question Total Accepted: 75227 Total Submissions: 214539 Difficulty: ...

  3. web报表工具FineReport经常使用函数的使用方法总结(文本函数)

    文本函数 CHAR CHAR(number):依据指定数字返回相应的字符.CHAR函数可将计算机其它类型的数字代码转换为字符. Number:用于指定字符的数字,介于1Number:用于指定字符的数字 ...

  4. AE属性表操作

    转自chanyinhelv原文AE属性表操作 实现的操作包括:1.打开属性表:2.编辑属性表:3.增加属性列:4.数据排序:5.字段计算…… 嗯,实现的功能目前就这些吧,后续还会继续跟进,还望大家多多 ...

  5. 浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移

    http://blog.csdn.net/dba_waterbin/article/details/8996872 ㈠ Redis 与 MySQL 的耦合性            在业务架构早期.我们 ...

  6. 【LCA最近公共祖先】在线离线

    [在线] 1.倍增法 现将深度较大的跳至与深度较小的统一深度.预处理$fa[u][i]$表示$u$往上跳$2^i$个单位后的祖先,则就可以像快速幂一样,将移动的步数化为二进制,如果第$i$位为$1$, ...

  7. Jsp bug_001

    报错: The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解 ...

  8. Hibernate综合问题

    n + 1问题 query.iterate()信息返回迭代查询将开始发表声明:录ID语句 Hibernate: select student0_.id ascol_0_0_from t_student ...

  9. asp.net中c#求百分比

    double m= 50;double n= 100; Response.Write((m/ (m+ n)).ToString("0%"));Response.Write((m/ ...

  10. http_load测试初阶

    http_load的标准的两个例子是: 1.         http_load -parallel 5 -fetches 1000 urls.txt 2.         http_load -ra ...