关于反射Assembly.LoadFrom方法一个注意点

时间:2021-08-15 21:27:22
背景知识
System.Reflection.Assembly类有两个静态方法:Assembly.Load(string assemblyname)和Assembly.LoadFrom(string filename) 。通常用这两个方法把程序集加载到应用程序域中。 如果你希望加载的程序集超出了CLR的预定探查范围,你可以用 Assembly.LoadFrom直接从一个文件位置加载程序集。
抽象类不可以被直接实例化,但是可以从其子类实例化。可以参考相关李氏替换原则(LSP)的知识;
实例代码
背景知识 类关系图如下,其中Person为抽象类。
关于反射Assembly.LoadFrom方法一个注意点

 

语义来来讲,抽象类表示I is kind of的一种关系,如下代码:

Person person  =   null ;
American american 
=   new  American();

person 
=  american  as  Person;
你能说美国人不是人吗 关于反射Assembly.LoadFrom方法一个注意点
好,如果这个对象是反射创建的对象是什么情况(至于为什么要用反射创建对象,可以参考相关工厂设计模式的文章)?
关于反射Assembly.LoadFrom方法一个注意点关于反射Assembly.LoadFrom方法一个注意点Code
注意这个Server.dll物理位置不在当前程序域范围而。 运行程序,你会发现,你得到的p对象为null?不信,你测试下。
问题在哪里
说句实话,我发这篇文章的目的就是想让大家讨论下,问题就究竟处在哪里?
注意,上面的代码如果你把Server.dll的物理位置修改成当前的应用程序目录下p就可以进行转化。 我把两中方式的Client.exe进行Refalctor查看IL,没有任何差别。 那就是一种可能:
当前在Demo.Client中声明的Person p,托管平台为是加载的dll中创建的 American的父类。
 bool isPerson = objInstance is Person;
即我们前文提到的超出了CLR的预定探查范围,如果真的是这样,对于“李氏替换原则”有什么好的解决办法? 
欢迎讨论 , 代码下载;