代码改变世界

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

2009-11-11 13:08  宗哥  阅读(6860)  评论(11编辑  收藏  举报
背景知识
System.Reflection.Assembly类有两个静态方法:Assembly.Load(string assemblyname)和Assembly.LoadFrom(string filename) 。通常用这两个方法把程序集加载到应用程序域中。 如果你希望加载的程序集超出了CLR的预定探查范围,你可以用 Assembly.LoadFrom直接从一个文件位置加载程序集。
抽象类不可以被直接实例化,但是可以从其子类实例化。可以参考相关李氏替换原则(LSP)的知识;
实例代码
背景知识 类关系图如下,其中Person为抽象类。

 

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

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

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