【问题标题】:Why does renaming a dll extension (I.e. to dllold) cause a FileNotFound exception at runtime?为什么重命名 dll 扩展名(即 dllold)会在运行时导致 FileNotFound 异常?
【发布时间】:2015-10-28 00:39:16
【问题描述】:

似乎在某个时候,在我们的一个网站上工作的开发人员必须手动更新生产 dll,我们将其称为“MyLibrary.dll”。为此,他们将旧的 dll 文件扩展名更改为“dllold”。加载此站点后,我们收到 System.IO.FileNotFoundException 错误,即Could not load file or assembly 'MyLibrary.dllold' or one of its dependencies. The system cannot find the file specified. 即使“MyLibrary.dll”和“MyLibrary.dllold”都在正确的目录中,我们也收到了此错误。只有在删除此“dllold”文件或完全删除扩展名的“dll”部分(即 MyLibrary.old)后,我们才能加载该网站。

所以我想知道为什么会发生这种情况?似乎 .NET 框架的任何部分在运行时拉入 dll 只寻找“dll”并且不关心之后的任何内容,但这并不能解释为什么它总是抓取“.dllold”库而不是工作的“.dll”库。

作为参考,我们使用 .NET 4.0 版和 ASP.NET 4.6 版。

【问题讨论】:

    标签: c# asp.net .net dll runtime-error


    【解决方案1】:

    加载 ASP.Net 项目时,它会尝试加载应用程序 bin 文件夹中的所有 DLL,它通过调用名为 LoadAllAssembliesFromAppDomainBinDirectory 的内部方法来完成此操作。在该方法内部,使用DirectortInfo.GetFiles(string) 方法检索DLL,模式为*.dll。正如文档所证实的,这与 .dllold 匹配:

    在 searchPattern 中使用星号通配符时(例如,“.txt”),匹配行为会因指定文件扩展名的长度而异。文件扩展名正好为三个字符的 searchPattern 返回具有三个或更多字符扩展名的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。文件扩展名为一个、两个或三个以上字符的 searchPattern 仅返回扩展名与 searchPattern 中指定的文件扩展名完全匹配的文件。使用问号通配符时,此方法仅返回与指定文件扩展名匹配的文件。例如,给定目录中的两个文件“file1.txt”和“file1.txtother”,搜索模式“file?.txt”只返回第一个文件,而搜索模式“file”。 txt" 返回两个文件。

    在程序集加载过程的其他地方,假定文件名需要.dll 后缀,这是一个不存在的文件,因此会引发您看到的异常。

    所以这个故事的寓意是:如果您需要停止加载 DLL,请将其从您的 bin 文件夹中删除,或者如果您必须将其留在那里,请给它一个不会加载的后缀得到匹配。

    【讨论】:

    • 太棒了,以为是这样的,只是不知道到底是什么。感谢您的回答!
    【解决方案2】:

    此外,根据对 DLL 所做的更改,如果两个副本都在 bin 文件夹中,您最终会加载两个具有相同命名空间的 DLL。这可能会导致应用程序无法正常运行的其他问题。与其他按需加载程序集的 .NET 应用程序不同,ASP.NET 在启动时加载所有 DLL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多