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

简介: 原文:C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享曾经我做office,不想依赖别人dll,就使用了Type.GetTypeFromProgID 可以根据 一个 ID 获得office的操作对象了,当然你也可以获得其他的操作对象,这个id就像一个密码。
原文: 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));

image.png

image.png

看完上面一段代码,能有什么用呢, 我也没发现啥,  从类型实例获得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));

image.png

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

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

image.png

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

新建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被执行");
        }
    }
}

image.png

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);

image.png


也可以这样创建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());

image.png

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


去掉类库的引用,拷贝生成的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#,”的文章

目录
相关文章
|
2月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
10天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
44 12
|
2月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
121 51
|
2月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
61 1
|
2月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
68 2
|
2月前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
53 1
|
2月前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
3月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
45 1
|
2月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
44 3
|
16天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
65 12