我有以下场景,当我试图进行强制转换时会抛出异常:
不能将AMyNamespace.PropertyMetaDataAttribute转换为BMyNamespace.PropertyMetaDataAttribute。类型A来源于'C:\projectA\bin\debug\A.dll‘处上下文'LoadFrom’中的'A、Culture=neutral、PublicKeyToken=null‘。B类型起源于'A,Version=12.0.0.25,Culture=neutral,PublicKeyToken=null‘,位于'C:\currentProject\bin\debug\A.dll’的上下文'Default‘中。
代码片段:
using MyNamespace; // added project reference to this item
m_Assembly = Assembly.LoadFile(ConfigurationManager.AppSettings["DLL_File_Path"]);
Type objectType = m_Assembly.GetType(string.Format("{0}.{1}", NAMESPACE_PREFIX, "MyObject"));
// Crash happens on line below:
Attribute attr = (Attribute) objectType.GetProperty("Name").GetCustomAttributes(false)[0];
//This is the layout of the object which has the property
MyObject
{
[MyAttribute(Name="FooName")]
Foo {get;set;}
}
// This is the definition of the attribute
MyAttribute :Attribute
{
// Want to access the value
public string Name = string.Empty;
}发布于 2009-04-22 15:45:57
就像你的
ConfigurationManager.AppSettings["DLL_File_Path"]指向其他位置的同一个dll,因此.Net运行时试图加载已加载的dll,当您尝试使用它时,类型系统会爆炸,因为在两个dll之间重复类型。
根据错误,这些是两个dll的位置
如果在解决方案上显式设置了引用,则可以尝试将复制本地设置为False,这样在解决方案生成时,不要复制依赖项的结果。
发布于 2009-04-22 16:07:13
如果您的dll已经在自动搜索的路径(当前目录、bin等)中,并且因为您引用了程序集中的某些内容而加载,那么您的LoadFile (您可能也希望使用LoadFrom )将把相同的DLL加载到另一个上下文(LoadFrom)中,而不是默认的。
您应该考虑只加载DLL一次,或者首先尝试从默认上下文中获取程序集,以避免冲突,方法是查看AppDomain.CurrentDomain.GetAssemblies()。
如果您试图访问不在默认上下文中的程序集,甚至可以将AssemblyResolve附加到AppDomain.CurrentDomain作为后盾。
http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx
AppDomain.CurrentDomain.GetAssemblies()将包含来自所有上下文的程序集,甚至包括使用LoadFrom/LoadFile加载的程序集。
发布于 2009-04-22 20:31:40
加载程序集时,可以将类型加载到不同的上下文中。这就是为什么你不能从一种类型到另一种类型。您可以使用AssemblyResolve事件(正如jishi建议的那样)来解决这个问题,也可以使用一个TypeResolve事件在使用它时返回正确的类型,但我认为您确实需要将程序集与正确的上下文对齐,并了解它何时加载、如何加载以及什么对您合适。
苏珊娜·库克博客上的这些文章确实帮助我理解了不同的背景,以及它们是如何被加载进来的,以及它们的原因。
http://blogs.msdn.com/suzcook/archive/2003/09/19/loadfile-vs-loadfrom.aspx
http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
另外,如果您想查看它们是如何加载的以及为什么加载的话,那么您应该查看设置为将所有信息转储出去的融合日志,它将显示程序集的加载信息。
https://stackoverflow.com/questions/777888
复制相似问题