无法反映共享不同版本依赖关系的程序集

时间:2010-02-24 07:31:56

标签: c# reflection assembly.reflectiononly

以下是使用 Assembly.ReflectionOnlyLoadFrom 的方案:

我的程序集 已检查 和我的反射应用程序 检查器 参考程序集 依赖项< / EM>

如果 检查器 引用 依赖关系1.0.0.0 检查 参考 依赖关系1.1.0.0 检查器 无法反映中的任何类型或方法使用 依赖 中的类型的已检查 。这种类型被击中的那一刻我得到:

  

System.IO.FileLoadException:无法   加载文件或程序集'依赖项,   版本= 1.1.0.0,文化=中立,   PublicKeyToken = null'或其中一个   依赖。定位组件   清单定义与之不匹配   装配参考。 (例外   HRESULT:0x80131040)

但是, Inspector 可以反映 依赖关系1.1.0.0 本身就好了,所以加载 依赖关系1.1.0.0 ,因为 Assembly.ReflectionOnlyLoadFrom 可以从已经使用 依赖关系1.0.0.0 的程序集中运行

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

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

依赖关系1.1.0.0 没有解决问题,因为我在foreach中设置了断点并确认已加载并检查 AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()的存在。它装好了。但是当我接着 assembly.GetTypes()时,它就会死掉。

我可以做些什么,或者我必须在单独的AppDomain中反映程序集,并将元数据编组回appnet域,该appdomain引用 依赖关系1.0.0.0

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我在最初提出问题 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>