以下是使用 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
答案 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>