c# 反射机制的基本了解
其他
2018-11-03 08:22:19
阅读次数: 0
1.反射机制的简单介绍
反射机制,有一个应用方面就是用来做插件,这么插件具体以后会做成什么样,我们不清楚,但反射机制使我们可以运行使用这个插件。
也就是说,反射机制使我们可以使用一些未知的类型,未知的函数方法等
2.使用之前先大概了解下应用程序的结构
基本是范围最大到最小
AppDomain:应用程序域,应用程序在其中执行的独立运行环境(最大)
Assembly:程序集 (包含一个或多个Module)
Module:模块
Type:类型
3.具体怎么用
dll代码
/*
using System;
namespace ExternDll
{
class Program
{
static void Main()
{
Console.WriteLine("ExternDll执行中");
}
}
}
*/
(1)引入需要程序集(exe、dll文件):
Assembly ExternDll = Assembly.Load("ExternDll");
(2)得到模块(单模块的程序集可忽略):
Module module=ExternDll.ManifestModule;
(3)得到所要的类型:
Type DllType= module.GetType("ExternDll.Program");
// Type DllType = ExternDll.GetType("ExternDll.Program");
(4)如果要使用某个类型中的方法,先创建类型实例,在得到方法
MethodInfo methodInfo=DllType.GetMethod("Main",BindingFlags.Static |BindingFlags.Public|BindingFlags.NonPublic);
object o = Activator.CreateInstance(DllType);
methodInfo.Invoke(o, new object[] { });
注意的问题:
(1)Assembly加载方法的使用
Assembly.Load()
Assembly.LoadFrom()
Assembly.LoadFromFile()
Assembly.ReflectionOnlyLoadFrom(String assemblyFile)
Assembly.ReflectionOnlyLoad(byte[] rawAssembly)
Assembly.ReflectionOnlyLoad(String assemblyName)
(2)BindingFlags的使用(从程序集筛选所需要的类型Type)
NonPublic:非Public修饰的 (需要与Static或Instance组合使用)
Public:Public修饰的 (需要与Static或Instance组合使用)
Static:静态的
Instance:实例的
DeclaredOnly:指定只获取自己定义的
GetField
SetField
BindingFlags.CreateInstance
(3) Activator.CreateInstance用法(可以用这个方法创建类型实例)
(4)Appdomain的使用
Appdomain类似轻量级进程,是 .net / mono 代码运行时的一个逻辑容器
一般情况下不需要关注Appdomain,除非以下的情况:
(1)动态卸载程序集(运行时加载程序集是不支持Unload的)
(2)实现程序隔离
(3)限制代码安全
(4)加载相同程序的不同版本
(5)有效利用资源
(6)减少内存占用
(5)早绑定与晚绑定
早绑定:编译器或解释器能知道代码中所指定的具体类型,能给出提示
晚绑定:程序运行才知道具体类型
转载自blog.csdn.net/qq_38806355/article/details/82846247