我们使用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似乎无法解决的引用程序集列表:
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.。希望这可以帮助其他人。
答案 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就可以了。