我们的构建服务器无法正确解析程序集引用

14
我们使用VS2008 SP1以C#编码。我们有一个运行Team System Server 2008的服务器,用于源代码控制、任务等。该服务器也是我们的Team Build构建机。这一直很好运作,但现在出了问题。我们尝试构建一个引用了一个外部程序集的项目时,会收到错误消息(这在通过Team Build进行构建和通过Visual Studio进行常规构建时都会发生)。请注意保留"{{"和"}}"和html标签。
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 警告 MSB3246: 已解析的文件存在错误图像、无元数据或无法访问。无法加载文件或程序集 'C:\Program Files\Syncfusion\Essential Studio\7.1.0.21\Assemblies\3.5\Syncfusion.XlsIO.Base.dll' 或其某个依赖项。 该模块应包含一个程序集清单。 C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets(24,2): 错误 MSB4062: 无法从程序集 Microsoft.ReportViewer.Common,Version=9.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 中加载“Microsoft.Reporting.RdlCompile”任务。无法加载文件或程序集 'Microsoft.ReportViewer.Common,Version=9.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或它的某一个依赖项。该模块应包含一个程序集清单。 确认声明是否正确,并且程序集及其所有依赖项是否可用。
所引用的组件“Syncfusion.XlsIO.Base”找不到。
这些错误是针对一个带有问题的程序集引用的项目。当我尝试构建整个解决方案时,由于这个错误,当然会有更多的错误。还有另外两个项目也存在同样的问题,只是涉及其他程序集引用。我有一份无法解析的 VS 引用程序集列表:
  • Microsoft.ReportViewer.Common
  • Microsoft.ReportViewer.WinForms
  • Syncfusion.Compression.Base
  • Syncfusion.Core
  • Syncfusion.XlsIO.Base
Syncfusion 程序集来自第三方组件包。其他两个与 Microsoft ReportViewer 组件相关。这些引用是通过“添加引用”窗口,在 .NET 选项卡中添加的,所以我认为没有什么可疑的地方。在程序集引用的属性窗口中,Culture、Description、Path、Runtime Version 或 Strong Name 没有值。版本显示为 0.0.0.0,Resolved 为 False。我想很明显 VS 无法解析该引用。我的问题是为什么?我已经在这个问题上苦苦思索了很久。这只发生在服务器上,在我的机器和同事的机器上,解决方案构建得非常好。我们机器上的程序集引用属性也没问题。
我尝试卸载服务器上的第三方组件,然后重新安装,没有帮助。我尝试修复VS2008安装,也没有帮助。我尝试从源代码控制中检索早期版本(我知道以前已在服务器上构建),结果收到相同的错误消息。我已经检查了文件权限,一切似乎都很正常。我已经没有更多的想法了...如何解决这个问题?
更新16.02.2009: 我尝试比较我的PC和服务器上dll的ildasm输出(请参见我写的评论),并且有一行略微不同,但对我来说似乎是注释。我必须承认我不明白为什么会有任何差异,所以也许有人可以向我解释一下?我还尝试在服务器上运行病毒扫描,没有帮助。试图删除引用,然后通过浏览磁盘上的dll来重新添加它,但没有成功。 更新于2009年3月17日:
我找到了解决方案!罪魁祸首是Panda Antivirus的TruPrevent模块。禁用该模块后,一切都正常了!=)
通过fuslogvw.exe和它生成的日志,我发现了这个问题。搜索结果,偶然发现了这篇博客文章。希望这能帮助其他人。
7个回答

3
几乎可以确定问题是环境问题,而不是源代码相关的问题。
一些想法:
(i) 尝试禁用您的防病毒/反恶意软件工具 - 我曾经看到过这些工具(特别是趋势科技杀毒软件)在扫描期间会锁定DLL文件,从而干扰编译器。
(ii) 检查您的PATH环境变量。即使在现代,PATH变量也用于解析某些内容 - 如果出现问题(太长,最大长度为2048个字符,如果我没记错),那么可能会出现奇怪的问题。
(iii) 您已经检查了文件权限 - 是否已经检查了注册表中的权限?例如,SyncFusion在用户和机器hive中都安装了其许可密钥 - 如果构建服务器无法读取其中一个,可能会导致问题。
祝你好运!

直到我自己找到了解决方案之后,我才看到你的答案,但是我会接受你的答案,因为你的建议非常准确。在熊猫杀毒软件中禁用TruPrevent就解决了问题。=) - Sub-Star

1
我们遇到了同样的问题,原来是C盘满了(只有28MB)。释放空间解决了这个问题,即使构建发生在D盘上。

1

也有可能是开发机器上的引用程序集在GAC中,但构建机器上没有。将其从GAC中移出,放入您的源代码库中,并通过路径进行引用。


0
你在你的机器上和服务器上看到这个文件的 ildasm 有什么区别吗?

我将ildasm的输出指向了服务器和我的机器上的一个txt文件。我使用VS2008 Team System中的差异工具进行了比较,发现其中一行不同: 在服务器上: // Image base: 0x03220000 在我的机器上: // Image base: 0x043C0000 所以是的,存在微小的差异。 - Sub-Star

0

我怀疑构建过程所使用的用户没有访问您的第三方控件所在文件夹的权限。由于这在您的机器上正常运行,几乎可以确定是与用户/权限有关。


0

你的第三方dll可能依赖于非托管dll。通常是因为缺少特定版本的VC++运行时dll。

在服务器上使用Dependency Walker http://www.dependencywalker.com/打开该dll并检查是否存在缺失引用。


0

不确定这是否对您有所帮助,但我之前遇到过类似的情况,其中一个dll显然被注销了,运行regsvr32命令即可解决问题。


运行RegSvr32在DLL上只有COM组件才需要;这个问题涉及到.NET DLL程序集的引用,与COM无关。虽然想法不错,但在这里不相关。 - Bevan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接