【问题标题】:What should happen when a reference is deleted?删除引用时会发生什么?
【发布时间】:2010-03-12 17:00:25
【问题描述】:

我有一个引用 dll 的 vb.net 3.5 应用程序(abc.dll,也在 .net 3.5 中) 应用程序会不时访问此 dll。如果在执行期间的任何时候,如果我删除了 dll,我希望应用程序在下次尝试使用 dll 中的类时抛出错误。但是,这不是我看到的行为。如果我在启动前删除 dll,应用程序会在启动时引发错误。但启动后删除dll时不会。

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

提前致谢。

【问题讨论】:

  • 你是想去掉启动错误,用了就报错,还是把程序集删了也报错?

标签: .net vb.net dll reference


【解决方案1】:

简短的回答没有。一旦加载了 DLL,它就会被加载,直到使用该 DLL 的 app AppDomain 实例从进程中卸载。只有这样你才能删除原来的DLL。

更长的答案:

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

  • 直接从磁盘加载。这个我知道的最少,但在这种情况下,CLR 可能会在程序集上锁定文件,因此应该可以完全删除它
  • 从影子目录加载。在这种情况下,DLL 实际上是从磁盘上的不同目录加载的,以允许进行诸如删除原始 DLL 之类的操作。这在 Web 应用场景中很流行。在这种情况下,删除原始 DLL 是没有意义的,因为重要的 DLL 是从 sort.s 的临时目录加载的

【讨论】:

  • 感谢 JaredPar。这是否意味着我的选择是:1)直接从磁盘加载 dll,而不是在我的项目中引用它 2)在使用 dll 中的类之前检查文件是否存在。我不确定哪个会更好。
  • @Apeksha,如果被删除的 DLL 是正常情况,我认为最好的方法是简单地将该类的加载包装在一个方法中,该方法捕获在 DLL 不存在时发生的异常。这是处理这种情况最可靠的方法
【解决方案2】:

当 .NET 框架尝试加载您正在引用的程序集时,总是会发生错误。所以看起来出于某种原因,CLR 决定在您的应用启动时加载程序集。

【讨论】:

    猜你喜欢
    • 2022-06-27
    • 2017-06-16
    • 2012-03-02
    • 1970-01-01
    • 2021-04-27
    • 2012-01-16
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多