使用Assembly.LoadFrom和Assembly.Load
混合加载程序集时的奇怪行为使用Assembly.LoadFrom加载程序集时遇到了奇怪的行为,稍后又使用Assembly.Load加载了。 我正在使用Assembly.LoadFrom加载程序集,其中程序集位于不是执行文件夹的文件夹中。
稍后在我的测试代码中,当我尝试使用Assembly.Load再次加载此程序集时,加载失败并出现System.IO.FileNotFoundException(“无法加载文件或程序集......”)尽管程序集已经存在已加载。使用强名称和非强名称加载失败(再次加载此装配的原始原因是使用BinaryFormatter)。
但是,如果程序集位于执行文件夹中,则后两个加载在两种情况下都会成功,具有强名称和非强名称。在这种情况下,您可以看到从两个不同的位置加载了两个相同的程序集。
重新创建此问题的简单代码示例 -
程序集assembly1 = Assembly.LoadFrom(@“C:\ a.dll”);
//使用强名称加载失败 程序集assembly2 = Assembly.Load(@“a,Version = 1.0.0.0, Culture = neutral,PublicKeyToken = 14986c3f172d1c2c“);
//同时加载非强失败 程序集assembly3 = Assembly.Load(@“a”);
感谢。
答案 0 :(得分:9)
这并不奇怪。根据文档,使用Load和LoadFrom加载会将程序集放在不同的上下文中。 This可能有帮助。
- CLR忽略已加载的程序集的任何解释?
醇>
因为他们处于不同的背景下。
- 我知道如何缓解这个问题?
醇>
从相同的上下文加载,或帮助CLR找到程序集,可能是通过将处理程序附加到AppDomain.AssemblyResolve
。
<强>替代强>
如果您要从中加载程序集的位置是AppDomain.BaseDirectory下的子文件夹,您只需在App.config中添加一个条目:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
答案 1 :(得分:7)
@Kent Boogart: 这似乎是正确的解释。要获得完整的解释,Suzanne Cook有一篇博文,其中详细介绍了您发布的原文: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
以下是利用AppDomain.AssemblyResolve -
的代码 // register to listen to all assembly resolving attempts:
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
// Check whether the desired assembly is already loaded
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies) {
AssemblyName assemblyName = assembly.GetName();
string desiredAssmebly = args.Name;
if (assemblyName.FullName == desiredAssmebly) {
return assembly;
}
}
// Failed to find the desired assembly
return null;
}