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

时间:2015-06-03 08:26:11

标签: .net dll locale app-config subdirectory

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

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

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

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

作为临时修复,我们可以添加它所需的文件夹结构并能够运行应用程序,但是必须重新添加文件夹结构并在每次清理/重建后手动复制和粘贴dll不长期限解决方案我也不知道:

  1. 为什么它有时会起作用。
  2. 造成这种行为的原因。
  3. 我不知道问题是关于实用程序库项目,nuget包还是消费项目。

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

    任何帮助都会受到大力赞赏,因为它阻碍了我们新库的发布。

1 个答案:

答案 0 :(得分:1)

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

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

远程拍摄是[AssemblyCulture]属性。它必须是中立的"对于包含代码的程序集。我认为可能会影响Fusion探测的位置,因为它无法在正常位置找到装配体。这应该是固定的,但核心问题仍然是它无法找到你的装配。

请注意[AssemblyVersion],如果您使用NuGet部署库,那么您通常还需要一个带有<bindingRedirect>的app.exe.config,因此您的库的更新不会破坏应用程序。永远不要使用#34; 1.0。*&#34;,这总会造成痛苦。

并使用Fuslogvw.exe来诊断此类加载失败。如果这些提示无法解决您的问题,请告诉我们您获得的痕迹。