基于GAC内容设置的.NET参考"复制本地"真/假

D-S*_*ect 17 .net log4net assemblies gac reference

我们在Win Forms项目中遇到了一个非常有趣的问题.它已经解决了.我们知道发生了什么,但我们想知道它为什么会发生.这可能有助于将来遇到类似问题的其他人.

WinForms项目在我们客户的两台PC上失败了.该错误是一个模糊的kernel.dll错误.该项目在另外3台PC上运行良好.

我们发现我们的发布文件夹中缺少.DLL(log4net.dll - 一个非常流行的开源日志库).它以前在我们的发布文件夹中.为什么在最新版本中缺少它?

它丢失了,因为我必须在我的开发盒上安装了一个程序,该程序使用了log4net.dll,并将其添加到全局程序集缓存中.

当我检查解决方案对log4net.dll的引用时,它们被更改为"copy local = FALSE".它们必须自动更改,因为我的GAC中存在log4net.dll.

这是我的问题开始的地方:

为什么我对log4net.dll的引用从COPY LOCAL = TRUE更改为COPY LOCAL = FALSE?我怀疑是因为它是由另一个程序添加到我的GAC中的.

我们怎样才能防止这种情况再次发生?现在,如果我安装一个使用公共库的软件并将其添加到我的GAC,那么引用该DLL的我的SLN将从Copy Local TRUE更改为FALSE.

Han*_*ant 6

发生这种情况是因为如果在GAC中安装了程序集,则Copy Local = True没有任何意义.由于永远不会使用本地副本,因此始终首先搜索GAC.保持不变会导致严重的混乱,你会认为你正在使用本地副本而是另外一个.如果您没有注意到它,那么更改它也会导致混淆,这可能是在解决方案加载时使用消息框解决的.

Log4net是一个麻烦制造者,在野外有太多版本,没有任何部署过程可以确保这些版本不相互咬合.Apache显然只是不想解决的事情,而是由程序员决定.拥有依赖于Log4net的产品并对感知的DLL Hell风险做一些事情在某种程度上是不可避免的.给你一个DLL地狱问题作为回报.

除了了解机器上安装的内容之外,没有简单明了的答案.当Visual Studio自动更新"复制本地"属性时,请考虑发布到connect.microsoft.com以请求警告.这是一个合理的问题.

  • 它让*perfect*有意义地尊重Copy Local = True ......应用程序永远不会在构建服务器上运行(除了可能在测试场景中).即使版本相同,您构建的目的是为了部署而不是在本地运行,因此复制到输出文件夹不会以任何方式损害构建. (14认同)
  • 对于碰巧已经安装***影响构建的无关程序更有意义.这些程序集不是故意添加到GAC中的. (11认同)
  • 在构建服务器上将*不*放置在GAC中更有意义. (3认同)