使用混合加载程序集时的奇怪行为Assembly.LoadFrom
and Assembly.Load
:
我在加载程序集时遇到了奇怪的行为Assembly.LoadFrom
稍后与Assembly.Load
。
我正在使用加载程序集Assembly.LoadFrom
,其中程序集位于一个文件夹中,该文件夹不是执行文件夹。
稍后在我的测试代码中,当我尝试再次加载此程序集时Assembly.Load
,负载失败并显示System.IO.FileNotFoundException
(“无法加载文件或程序集...”)尽管程序集已经加载。强名称和非强名称的加载都会失败(再次加载此程序集的原始原因是使用BinaryFormatter
).
但是,如果程序集位于执行文件夹中,则在使用强名称和非强名称的两种情况下,稍后加载都会成功。在这种情况下,您可以看到从两个不同的位置加载了两个相同的程序集。
重现此问题的简单代码示例:
Assembly assembly1 = Assembly.LoadFrom(@"C:\a.dll");
// Loading with a strong-name fails
Assembly assembly2 = Assembly.Load(@"a, Version=1.0.0.0, Culture=neutral, PublicKeyToken=14986c3f172d1c2c");
// Also loading with a non-strong fails
Assembly assembly3 = Assembly.Load(@"a");
- 有什么解释为什么 CLR 会忽略已经加载的程序集吗?
- 知道如何缓解这个问题吗?
这并不奇怪。根据文档,使用 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>
http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)