0

这是使用Assembly.ReflectionOnlyLoadFrom的场景:

我的 assembly Inspected和我的反射 Application Inspector都引用了 Assembly Dependency

如果Inspector引用Dependency 1.0.0.0并且Inspected引用Dependency 1.1.0.0,则Inspector无法反映 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 ?

4

2 回答 2

0

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

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

于 2010-02-24T09:01:26.807 回答
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>
于 2021-07-08T04:10:42.150 回答