原文: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. 小强的HTML5移动开发之路(52)——jquerymobile中的触控交互

    当使用移动设备进行触控操作时,最常用的就是轻击.按住屏幕或者手势操作,jQuery Mobile可以通过绑定的触控事件来响应使用者的特定触控行为. 一.轻击与按住 直接上代码(一切皆在代码中,细细品吧 ...

  2. php利用反射机制查找类和方法的所在位置

    //参数1是类名,参数2是方法名 $func = new ReflectionMethod('UnifiedOrder_pub', 'getPrepayId'); //从第几行开始 $start = ...

  3. css选择器指定元素中第几个子元素

    tr td:nth-child(2){ background-color:gray; } 就是tr当中的td的第二个td的属性 tr:nth-child(2n+0){ background-color ...

  4. 数据局部性(data locality)

    信息处理的典型模式是,将所有数据项视为一个集合,并将其组织为适宜的数据结构(或者说使用适宜的数据结构对之进行存储以及组织),进而借助操作接口高效访问. 为了考查和评价各操作接口的效率,除了从最坏情况的 ...

  5. 【codeforces 760B】Frodo and pillows

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. 测试与 debug 心得

    测试不等同于调试,各自都有自己的概念集和方法论. Test:examine input/output pairs. 调试:定位,修改. 但如果能做到错误异常的准确定位,调试的一半以上的工作已经完成了. ...

  7. Java相关思维导图分享

    非常多朋友都给我发私信希望获得一份Java知识的思维导图,我来不及一一答复.原先是给大家一个百度网盘的链接分享,大家能够自己去下载,可是不知道云盘还能用多久.把相关资源转移到了QQ的群共享中.须要的朋 ...

  8. JVM源码分析之System.currentTimeMillis及nanoTime原理详解

    JDK7和JDK8下的System.nanoTime()输出完全不一样,而且差距还非常大,是不是两个版本里的实现不一样,之前我也没注意过这个细节,觉得非常奇怪,于是自己也在本地mac机器上马上测试了一 ...

  9. 双机热备的Quartz集群

    sqlserver搭建高可用双机热备的Quartz集群部署[附源码]   一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz ...

  10. Activity启动模式需注意的坑

    标准启动Standard模式版本差异: 在Lollipop之前,每次以MULTIPLE启动的Activity都会被压入当前任务的顶部,启动 N 次,在当前任务就会出现 N 个Activity的实例,每 ...