【问题标题】:Assembly references won't resolve properly on our build server程序集引用无法在我们的构建服务器上正确解析
【发布时间】:2010-10-07 13:01:35
【问题描述】:

我们使用 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 文件\Syncfusion\Essential Studio\7.1.0.21\Assemblies\3.5\Syncfusion.XlsIO.Base.dll' 或其依赖项之一。 模块 预计将包含一个程序集 清单。

C:\程序 文件\MSBuild\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets(24,2): 错误 MSB4062: “Microsoft.Reporting.RdlCompile”任务 无法从程序集中加载 Microsoft.ReportViewer.Common, 版本=9.0.0.0,文化=中性, PublicKeyToken=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 组件来自第 3 方组件包。其他两个与 Microsoft ReportViewer 组件有关。

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

我已经尝试卸载 第三方组件(当然是在服务器上),然后重新安装。没有帮助。我尝试修复 VS2008 安装。没有帮助。试图从 源代码管理 中检索 早期版本(我知道以前在服务器上构建过),但我收到了相同的错误消息。我检查了文件权限,一切正常。我的想法不多了...

我该如何解决这个问题?

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

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

【问题讨论】:

    标签: c# tfsbuild assembly-resolution


    【解决方案1】:

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

    一些想法...

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

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

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

    祝你好运!

    【讨论】:

    • 直到我自己发现解决方案后才看到您的答案,但我会给您接受的答案,因为您的建议是正确的。在 Panda Antivirus 中禁用 TruPrevent 可以解决问题。 =)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 我将 ildasm 的输出定向到服务器和我的机器上的 txt 文件中。我使用 VS2008 Team System 中的 diff 工具对它们进行了比较,发现一行显示不同:在服务器上:// Image base:0x03220000 在我的机器上:// Image base:0x043C0000 所以是的,有一个微小的差异。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 只有 COM 组件需要在 DLL 上运行 RegSvr32;这个问题是关于引用 .NET DLL 程序集,而不是 COM。好主意,只是在这里不相关。
            猜你喜欢
            • 2017-11-29
            • 1970-01-01
            • 1970-01-01
            • 2012-02-03
            • 1970-01-01
            • 2015-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多