【问题标题】:Cannot reflect over assembly that shares a dependency of different version无法反映共享不同版本依赖项的程序集
【发布时间】:2010-02-24 07:31:56
【问题描述】:

这是使用 Assembly.ReflectionOnlyLoadFrom 的场景:

我的程序集 Inspected 和我的反射应用程序 Inspector 都引用了程序集 Dependency

如果 Inspector 引用 Dependency 1.0.0.0Inspected 引用 Dependency 1.1.0.0Inspector 不能反映 中的任何类型或方法Inspected 使用来自 Dependency 的类型。当这种类型被击中时,我得到:

System.IO.FileLoadException:不能 加载文件或程序集'依赖, 版本=1.1.0.0,文化=中性, PublicKeyToken=null' 或其之一 依赖关系。位于的组件的 清单定义不匹配 装配参考。 (例外来自 HRESULT: 0x80131040)

但是,Inspector 可以很好地反映 Dependency 1.1.0.0 本身,所以加载 Dependency 1.1.0.0 作为 Assembly.ReflectionOnlyLoadFrom 确实可以在已经使用 Dependency 1.0.0.0 的程序集中工作强>。

这是我用来加载程序集并预加载它的依赖项的代码:

var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
foreach (var assemblyName in assembly.GetReferencedAssemblies()) {
  Assembly.ReflectionOnlyLoad(assemblyName.FullName);
}

Dependency 1.1.0.0 没有解决不是问题,因为我在 foreach 中设置了一个断点并确认它已加载并检查 AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies() 因为它的存在。加载好了。但是当我执行 assembly.GetTypes() 时,它就死了。

对此我能做些什么吗,或者我是否必须在单独的 AppDomain 中反映程序集并将元数据编组回引用 Dependency 1.0.0.0 的 appdomain em>

【问题讨论】:

    标签: c# reflection assembly.reflectiononly


    【解决方案1】:

    Customizing the .NET Framework Common Language Runtime 中,解释了 Load 和 LoadFrom 为加载的程序集创建单独的“范围”,我想这可以解释问题。 可以尝试自己查找程序集并使用 LoadFrom 加载它们。

    您是否尝试过处理 AppDomain.AssemblyResolve 事件?

    【讨论】:

    • 我尝试了 AppDomain.AssemblyResolve 和 AppDomain.ReflectionOnlyAssemblyResolve 都没有被解雇。我认为这是因为它已经加载了不同的版本。我会看看我是否只能使用 LoadFrom。
    • 原来是使用 LoadFrom 加载家属的问题。我最初的测试一直失败,但出于其他原因。现在一切都好。
    • 再想一想,这是有道理的,因为有 .NET 本身加载的 DLL,这是通过 Load 而不是 LoadFrom 完成的。因此,正确的建议应该是尝试不使用 LoadFrom
    • Load 的问题是已经加载了另一个版本,所以不知何故 Load 不会失败但也不会加载它,但是通过使用 LoadFrom 它成功了。如果 LoadFrom 失败,我实际上会依靠 Load(所以我可以加载 GAC 依赖项)。只是 Load 给了我一个误报。
    【解决方案2】:

    我在最初的问题 11 年后才遇到这个问题。通过将当前的 AppDomain 策略应用于通过反射加载的程序集来解决它:

    Assembly.ReflectionOnlyLoad(AppDomain.CurrentDomain.ApplyPolicy(args.Name));
    

    在 app.config 中注意正在运行的应用程序,您将需要这样的重定向:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Some.Dependency" publicKeyToken="someToken" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      相关资源
      最近更新 更多