13

我们使用 VS2008 SP1 用 C# 编写代码。我们有一台运行 Team System Server 2008 的服务器,我们将其用于源代码控制、任务等。该服务器也是我们用于Team Build的构建机器。这已经工作了很长时间了。直到目前。当我们尝试构建一个引用了一个外部程序集的项目时,我们会收到这些错误消息(这发生在 Team Build 中,以及在物理登录并通过 Visual Studio 进行常规构建时):

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 程序集加载“Microsoft.Reporting.RdlCompile”任务。 ReportViewer.Common,版本=9.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a。无法加载文件或程序集 '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 程序集来自第 3 方组件包。其他两个与 Microsoft ReportViewer 组件有关。

引用是通过.NET 选项卡中的“添加引用”窗口添加的,所以我认为这没有任何可疑之处。在程序集引用的属性窗口中,Culture、Description、Path、Runtime Version 或 Strong Name 中没有值。版本说 0.0.0.0 和 Resolved 是 False。我想很明显 VS 无法解析引用。我的问题是为什么???我为这个问题挠了挠头。这仅发生在服务器上,该解决方案在我的机器和我的同事机器上都构建得很好。装配参考属性在我们的机器上很好。

我尝试卸载3rd-party 组件(当然是在服务器上),然后重新安装。没有帮助。我试图修复VS2008安装。没有帮助。试图从源代码控制中检索早期版本(我知道以前在服务器上构建过),但我得到了相同的错误消息。我检查了文件权限,一切似乎都井井有条。我的想法已经不多了...

我该如何解决这个问题?

2009 年 2 月 16 日更新:
我试图比较我的电脑和服务器上的 dll 的 ildasm 输出(请参阅我写的关于此的评论),在我看来是评论的一行中有一个小差异。我必须承认我根本不明白为什么会有区别,所以也许有人可以向我解释一下?我还尝试在服务器上
运行病毒扫描。没有帮助。试图删除引用,然后通过浏览磁盘上的 dll 来读取它没用。

2009 年 3 月 17 日更新:
我找到了解决方案!罪魁祸首是Panda Antivirus 的 TruPrevent 模块。禁用模块后,一切正常!=)我在fuslogvw.exe及其生成的日志
的帮助下发现了这一点。谷歌搜索结果,偶然发现了这个博客条目。. 希望这可以帮助其他人。

4

7 回答 7

3

几乎可以肯定问题是环境问题 - 与来源无关。

一些想法...

(i) 尝试禁用您的防病毒/反恶意软件工具 - 我已经看到这些工具(尤其是趋势科技防病毒软件,出于某种原因)可以在(期间?)扫描后锁定 DLL 文件,干扰编译器。

(ii) 检查您的 PATH 环境变量。即使在现代,PATH 变量也被用来解决一些问题——如果这搞砸了(太长,最大长度是 2048 个字符 IIRC),那么事情可能会很奇怪。

(iii) 您检查过文件权限 - 您是否检查过注册表中的权限?例如,SyncFusion 将其许可证密钥安装在用户和机器配置单元中——如果构建服务器无法读取其中一个,可能会导致问题。

祝你好运!

于 2009-03-10T06:16:43.777 回答
1

也可能是引用的程序集在开发机器上的 GAC 中,但不在构建机器上。将它从 GAC 中取出,放入您的源存储库,并通过路径引用它。

于 2009-02-24T22:43:37.750 回答
1

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

于 2014-07-08T09:57:14.807 回答
0

你看到这个文件的 ildasm 有什么不同吗

'C:\Program Files\Syncfusion\Essential Studio\7.1.0.21\Assemblies\3.5\Syncfusion.XlsIO.Base.dll'

在您的机器上还是在服务器上?

于 2009-02-13T20:13:13.920 回答
0

我怀疑构建过程所在的用户无权访问您的 3rd 方控件所在的文件夹。由于这在您的计算机上正常运行,因此几乎可以肯定是用户/权限特定的。

于 2009-02-24T22:34:41.593 回答
0

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

在您的服务器上使用 Dependency Walker http://www.dependencywalker.com/打开 Dll并检查缺少的引用。

于 2009-03-09T17:46:18.947 回答
0

不确定这是否对您的情况有所帮助,但在 dll 显然以某种方式未注册之前,我确实有类似的事情,并且在 dll 上运行 regsvr32 就可以了。

于 2009-03-10T04:04:37.043 回答