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

时间:2009-02-13 20:06:48

标签: c# team-build assembly-resolution

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

  

C:\ Windows \ Microsoft.NET \框架\ v3.5版本\ Microsoft.Common.targets   :警告MSB3246:已解决的文件有   图像不好,没有元数据,或者是   否则无法进入。不能加载   文件或程序集'C:\ Program   文件\ Syncfusion \本质   工作室\ 7.1.0.21 \组件\ 3.5 \ Syncfusion.XlsIO.Base.dll”   或其中一个依赖项。 模块   预计会包含一个集会   清单。

     

C:\程序   FILES \的MSBuild \微软\ VisualStudio的\ 9.0 \ ReportingServices \ Microsoft.ReportingServices.targets(24,2):   错误MSB4062:   “Microsoft.Reporting.RdlCompile”任务   无法从程序集中加载   Microsoft.ReportViewer.Common,   版本= 9.0.0.0,文化=中立,   公钥= b03f5f7f11d50a3a。可以   不加载文件或程序集   “Microsoft.ReportViewer.Common,   版本= 9.0.0.0,文化=中立,   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:
我试图在我的电脑和服务器上比较ildasm输出的dll(参见我写的评论),并且在一行中有一个小的区别,对我来说似乎是一个评论。我必须承认,我不明白为什么会有所不同,所以也许有人可以向我解释一下? 我还尝试在服务器上运行病毒扫描。没有帮助。尝试删除 引用,然后读取,方法是浏览到磁盘上的dll。没工作。

更新17.03.2009:
我找到了解决方案!罪魁祸首是Panda Antivirus的 TruPrevent模块。禁用模块后,一切正常! =)
我在fuslogvw.exe的帮助下及其生成的日志中发现了这一点。用Google搜索结果,偶然发现this blog entry.。希望这可以帮助其他人。

7 个答案:

答案 0 :(得分:3)

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

一些想法......

(i)尝试禁用您的防病毒/反恶意软件工具 - 我见过这些工具(特别是趋势科技杀毒软件,出于某种原因)可以在扫描(扫描期间)后干扰DLL文件的情况与编译器。

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

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

祝你好运!

答案 1 :(得分:1)

引用的程序集也可能位于开发计算机上的GAC中,但不在构建计算机上。将它从GAC中导出到源存储库中,然后按路径引用它。

答案 2 :(得分:1)

我们遇到了同样的问题,结果 C驱动器已满(仅有28MB)。
释放空间解决了这个问题,即使构建发生在D。

答案 3 :(得分:0)

您是否看到此文件的ildasm之间存在任何差异

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

在您的计算机上而不是在服务器上?

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

不确定这对你的情况是否有帮助,但我之前确实有类似的东西,其中一个dll显然未注册,并且在dll上运行regsvr32就可以了。