最近在更改网络消息协议,发现接收消息解析是先根据消息ID来反射实例化出对应的消息解析类。之前都没有用过反射,就顺便来学习了一下。具体反射都有些什么呢?这两个都讲的相当的详细:||我是第一个文章 || 我是第二个文章 || 我们来看看中间的怎么来实例出对象的吧。
Load小用法
load用来加载指定的程序集,有字母大小之分。
var assLoad=Assembly.Load("需要加载的程序集名称");
var assLoadFrom= Assmbly.LoadFrom("需要加载的dll的路径");
**下面主要说一下反射dll,并使用它的方法嘛,加载程序集的方法时差不多的,就不写了。 **
Dll类:
namespace MyDll
{
public class MyClass
{
public void Print()
{
Console.WriteLine("dll print");
}
public void Add(int a, int b)
{
Console.WriteLine("dll add:" + (a + b));
}
public static void Sub(int a, int b)
{
Console.WriteLine("dll sub:" + (a - b));
}
private void Mult(int a, int b)
{
Console.WriteLine("dll mult:" + (a*b));
}
}
}
客户端:
var assLoadFrom = Assembly.LoadFrom(@"C:\Users\Administrator\Desktop\MyDll.dll");
foreach (var c in assLoadFrom.DefinedTypes)
{
Console.WriteLine(c);//获得这个程序集中的类型的集合。
}
var obj = assLoadFrom.CreateInstance("MyDll.MyClass");
foreach (var me in obj.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance|BindingFlags.Public|BindingFlags.Static))
{
Console.WriteLine(me);
}
var parameters = new object[2] {1, 2};
obj.GetType().GetMethod("Print").Invoke(obj, null);
obj.GetType().GetMethod("Add").Invoke(obj, parameters);
obj.GetType().GetMethod("Sub").Invoke(obj, parameters);
obj.GetType().GetMethod("Mult", BindingFlags.NonPublic|BindingFlags.Instance).Invoke(obj,parameters);
unity中的小用法
我在unity开发中还没有接触到用上面的那些方法,我接触到就是以下的这个东西。
var msg=(Message)Assembly.GetCallingAssembly().CreateInstance("ResMessage");
这个是通过反射来创建一个message的一个对象,就是用到抽象工厂实例,那个文章更加生动的体现了这个是怎么用的。
这里有个不同的东西
Assembly.GetCallingAssembly()//是返回当前的程序集
Assembly.GetEntryAssembly()//返回默认应用程序域中的进程可执行文件
可以看到两句相同的代码,返回了不同的结果。第一个在控制台中返回的Microsoft.VisualStudio.HostingProcess.Utilities.dll这个dll文件的程序集,在unity中返回的就是当前unity中的程序集,个人感觉在unity如果要用反射出对象用它准没问题。第二在控制台中返回的应该是启动项目的程序集,在unity中托管程序集是从非托管的应用程序加载,所以返回的null。
先写这么多吧,如果有哪里错了,请大家指出来哦,谢谢啦。