首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射铸造

反射铸造
EN

Stack Overflow用户
提问于 2009-04-22 15:39:16
回答 3查看 2.5K关注 0票数 1

我有以下场景,当我试图进行强制转换时会抛出异常:

  1. 我添加了一个项目引用并导入了项目的命名空间。
  2. LoadFile行加载生成此项目时生成的dll。
  3. 我正在尝试访问属性的公共字段,该属性从dll中装饰对象的属性。
  4. 这是一个特例:

不能将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‘中。

代码片段:

代码语言:javascript
复制
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;
 }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-22 15:45:57

就像你的

代码语言:javascript
复制
ConfigurationManager.AppSettings["DLL_File_Path"]

指向其他位置的同一个dll,因此.Net运行时试图加载已加载的dll,当您尝试使用它时,类型系统会爆炸,因为在两个dll之间重复类型。

根据错误,这些是两个dll的位置

  • C:\currentProject\bin\debug\A.dll
  • C:\projectA\bin\debug\A.dll

如果在解决方案上显式设置了引用,则可以尝试将复制本地设置为False,这样在解决方案生成时,不要复制依赖项的结果。

票数 4
EN

Stack Overflow用户

发布于 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加载的程序集。

票数 1
EN

Stack Overflow用户

发布于 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

另外,如果您想查看它们是如何加载的以及为什么加载的话,那么您应该查看设置为将所有信息转储出去的融合日志,它将显示程序集的加载信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/777888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档