.NET 应用程序在特定于语言环境的子文件夹中查找 DLL

.NET Application looking for DLLs in locale specific sub-folder

我公司有一些内部实用程序库,其中包含基本服务、有用的扩展方法等内容。

我最近从头开始完全重写了这些,并将它们打包为 nu-get 包,托管在我们的内部网络上。

当我添加了对项目中的包的 NuGet 引用时,应用程序将会构建,但有时在调试或 运行ning 时它会失败,提示找不到库。这似乎完全是随机的,通常如果我重新构建和重新部署,问题会暂时得到解决。

我的一位同事通过 运行ning 进程监视器设法缩小了问题范围,发现应用程序正在寻找 bin/en-GB/{MyCompany.DllName 中的文件}/{MyCompany.DllName}.dll 当文件实际上在 bin/{MyCompany.DllName}.dll 中时,正如我默认情况下所期望的那样。

因此,作为临时修复,我们可以添加所需的文件夹结构,并且能够 运行 应用程序,但必须重新添加文件夹结构并在每次 clean/rebuild 不是长久之计。我也不知道:

  1. 为什么它有时有效。
  2. 是什么导致了这种行为。

我不知道问题出在实用程序库项目、nuget 包还是消费项目上。

我意识到这可能是 .NET 设计的一些有用功能,允许特定于区域设置的 ddls 版本,但在这种情况下我不需要它们,并且 dll 可以 be/is 文化不变。

我们将非常感谢任何帮助,因为它阻碍了我们新库的发布。

.NET 中没有任何机制可以在 "en-GB" 子目录中查找包含代码的程序集。它仅用于附属程序集,它们不包含代码,仅包含资源,并且是 ResourceManager class 进行探测。

这种行为唯一可能的候选者是应用程序中不正确的 AppDomain.AssemblyResolve 事件处理程序。如果由于某种原因无法找到您的程序集,将 运行 举行的活动。在代码库中搜索 "AssemblyResolve",它通常徘徊在 Main() 方法附近。

远射是[AssemblyCulture]属性。对于包含代码的程序集,它必须是 "neutral"。我 认为 这可能会影响 Fusion 在正常位置找不到程序集时探测的位置。那应该是固定的,但核心问题仍然是它找不到你的程序集。

请注意 [AssemblyVersion],如果您使用 NuGet 部署库,那么您通常还需要 app.exe.config 和 <bindingRedirect>,这样库的更新就不会破坏应用程序。永远不要使用,比如说,“1.0.*”,这总是会导致痛苦。

并使用 Fuslogvw.exe 来诊断这样的加载故障。如果这些提示不能解决您的问题,请向我们展示您获得的踪迹。