在运行时我加载一个程序集
Assembly assembly = Assembly.LoadFrom(@"c:\MyFolder\MyAssembly.dll");
如果程序集位于该文件夹中,则此方法有效。
如果程序集不在文件夹中,我会得到一个异常,当然告诉我无法找到程序集或其依赖项之一。
我正在捕获异常并向用户显示错误消息。程序继续运行。
如果我现在将丢失的程序集复制到文件夹“c:\MyFolder”,而程序仍在运行,并再次触发该函数来执行上面的行我得到同样的异常 - System.IO.FileNotFoundException - 再次无法找到程序集,尽管 DLL 现在位于文件夹中.
如果我重新启动应用程序,它就会工作并找到程序集。如果我在应用程序启动后第一次尝试加载程序集之前启动应用程序并将 DLL 复制到文件夹中,它也可以工作。
所以问题似乎与第一次失败的调用有关Assembly.LoadFrom
.
造成这种行为的原因是什么?我可以采取什么措施来解决该问题?
提前感谢您的帮助!
编辑:还有一个细节:
我添加了一个File.Exists
test:
string filename = @"c:\MyFolder\MyAssembly.dll";
bool test = File.Exists(filename);
Assembly assembly = Assembly.LoadFrom(filename);
test
回报true
but Assembly.LoadFrom
抛出一个FileNotFoundException
.
功能,而不是错误。这是DLL Hell的对策。操作术语是“加载上下文”,搜索苏珊娜·库克的博客 http://blogs.msdn.com/b/suzcook/来了解更多关于这句话的信息。简而言之,CLR 会记住以前加载程序集的尝试。首先也是最重要的,它记录成功的绑定并保证exact即使磁盘内容已更改,也会再次加载相同的程序集。毫无疑问,你可以看到这样做的好处,突然变得another装配几乎总是灾难性的。
对于failed程序集绑定。它也会记住这些,出于同样的原因,它将来也会失败。据我所知,没有记录的方法可以重置加载上下文。 Assembly.LoadFile() 在没有加载上下文的情况下加载程序集。但这会导致一系列其他问题,您真的不想使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)