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#,”的文章

目录
相关文章
|
5天前
|
C#
C#的基本语法结构学习
【5月更文挑战第17天】C#基础语法包括变量(如`int x = 10`)、常量(`const int MAX_VALUE = 100`)、运算符(如算术和比较运算符)、控制语句(if、for、while等)和函数声明(`int Add(int x, int y) { return x + y; }`)。这些构成C#程序的基本元素。
18 0
|
5天前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
19 1
|
6天前
|
监控 安全 C#
开发公司电脑监控软件的报警系统:一个C#示例
在当今数字化时代,企业对其计算机网络和系统的安全性和稳定性越来越重视。为了确保员工遵守公司政策、保护机密信息以及监控系统的正常运行,开发一种可靠的公司电脑监控软件变得至关重要。本文将介绍如何使用C#编写一个简单而有效的报警系统,以便监控关键数据并在必要时发出警报。
14 0
|
6天前
|
存储 运维 BI
基于C#-VC-MSSQL开发的全套PACS系统源码 3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
PACS的功能价值在于通过连接不同的影像设备,存储与管理图像,图像的调用与后处理,实现资源共享,降低成本,达到提高工作效率、提升医疗水平的目地;
15 1
基于C#-VC-MSSQL开发的全套PACS系统源码  3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
|
6天前
|
存储 开发框架 前端开发
C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码
医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标,将医学检验、科室管理和财务统计等检验科室/实验室所有工作进行整合,全面改善检验科室/实验室的工作现状。
21 0
|
6天前
|
Java C# 开发工具
开发语言漫谈-C#
C#的#,字面上的意思就是++++
|
6天前
|
图形学
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
|
6天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
24 0
|
6天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
6天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。