您的位置:首页 > 其它

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

2009-11-11 13:08 316 查看
body
{
line-height:1.5;
}

dl dt
{
font-size:20px;
font-weight:bold;
}

dl dd
{
font-size:15px;
font-family:宋体;

}

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

实例代码
背景知识 类关系图如下,其中Person为抽象类。
Code
abstract public class Person
{
abstract public string Speak();
}

public class American:Person
{
public override string Speak()
{
return "英语";
}
}
public class Chinese:Person
{
public override string Speak()
{
return "中文";
}
}

//----------------------------------------------------

static void Main(string[] args)
{
Person p = null;
string instanceType = ConfigurationSettings.AppSettings["TnstanceType"].Trim();
string assembleFileName = @"D:\C#\Demo\Server\bin\Debug\Demo.Server.dll";

Assembly assm = Assembly.LoadFile(assembleFileName);
Type objType = assm.GetType("Demo.Server.American");
object objInstance = Activator.CreateInstance(objType,true);

p = objInstance as Person;
p.Speak();

}
注意这个Server.dll物理位置不在当前程序域范围而。 运行程序,你会发现,你得到的p对象为null?不信,你测试下。

问题在哪里
说句实话,我发这篇文章的目的就是想让大家讨论下,问题就究竟处在哪里?
注意,上面的代码如果你把Server.dll的物理位置修改成当前的应用程序目录下p就可以进行转化。 我把两中方式的Client.exe进行Refalctor查看IL,没有任何差别。 那就是一种可能:
当前在Demo.Client中声明的Person p,托管平台为是加载的dll中创建的 American的父类。
bool isPerson = objInstance is Person;
即我们前文提到的超出了CLR的预定探查范围,如果真的是这样,对于“李氏替换原则”有什么好的解决办法?
欢迎讨论 ,代码下载;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐