2010-03-12 35 views
1

我有一个vb.net 3.5应用程序引用一个DLL(abc.dll,也在.net 3.5中) 这个DLL是由应用程序不时访问。如果在执行过程中的任何时候,如果我删除了dll,我希望应用程序在下次尝试使用dll中的类时发生错误。但是,这不是我所看到的行为。如果我在启动前删除了dll,应用程序在启动时会引发错误。但不是当启动后删除dll时。参考被删除时会发生什么?

这是标准行为,还是我做错了什么? 如果在尝试使用类时未找到dll,是否可以让应用程序抛出错误?

在此先感谢。

+0

这是一个桌面应用程序 – Apeksha 2010-03-12 17:14:41

+0

是否要删除启动错误,并且如果使用了错误,或者*还有*如果程序集被删除时发生错误? – 2010-03-12 17:26:00

回答

3

简答题没有。一旦DLL被加载,它就会被加载,直到使用该DLL的应用程序0123'从进程中卸载。只有这样你才能删除原始的DLL。

较长的答案:

这是一个复杂的问题,因为它取决于DLL是如何被加载到进程。有几种不同的方式可以发生这种情况

  • 直接从磁盘中卸载。这是我最不了解的一件事,但在这种情况下,CLR可能会对组件进行文件锁定,因此应该可以根本删除它。
  • 从影子目录加载。在这种情况下,DLL实际上是从磁盘上的不同目录加载的,以允许执行诸如删除原始DLL之类的操作。这在Web应用场景中很受欢迎。在这种情况下,删除原始DLL是没有意义的,因为重要的DLL是从一个临时目录中加载的.s
+0

谢谢JaredPar。 这是否意味着我的选择是: 1)直接从磁盘加载dll而不是在我的项目中引用dll 2)在使用dll中的类之前检查文件是否存在。 我不确定哪一个会更好。 – Apeksha 2010-03-12 17:12:53

+0

@Apeksha,如果被删除的DLL是一个正常的场景,我认为最好的方法是简单地将该类的加载包装在捕获如果该DLL不存在的情况下发生的异常的方法中。这是处理这种情况最可靠的方法 – JaredPar 2010-03-12 17:14:39

0

错误总是发生在.NET框架尝试加载引用的程序集时。所以看起来CLR决定在应用程序启动时加载程序集。

相关问题