由于缺少依赖关系,MSBuild清理操作失败

时间:2017-02-28 11:35:05

标签: c# .net visual-studio-2010 msbuild cruisecontrol.net

我有一个包含许多项目文件的visual studio 2010解决方案文件。如果我使用devenv清理解决方案,那么clean将成功完成,但是,如果我使用MSBuild,则由于缺少依赖关系error MSB3395,两个项目文件无法清除。如果我在故障发生后第二次运行Clean,则清除完成且没有错误。

我们使用MSBuild构建成功。

  

任务"取消注册组件" (TaskId:204)......

     

...

     

错误MSB3395:无法取消注册程序集   " C:\构建\风向\ MyFile.dll&#34 ;.无法加载文件或   assembly' MyOtherFile,Version = 10.0.0.414,   Culture = neutral,PublicKeyToken = 266e457ed35afd03'或其中一个   依赖。该系统找不到指定的文件。   [C:\构建\风向\ ProjFolder \ MyFileProj.vbproj]

是的,这个程序集是一个COM互操作程序集,因此构建注册程序集。如果我删除与两个问题区域相关联的UnmanagedRegistration.cache文件,则清除完成没有问题。但是,这些文件未注销,注册表填写旧的COM注册。我也不确定对未来构建的影响。

我在这里阅读了VS2008项目的文章https://blogs.msdn.microsoft.com/visualstudio/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe/ 但是,我不认为这适用于这种情况,因为这个构建过程已经正常清理和构建数月。

我还读过:https://www.experts-exchange.com/questions/26259422/msbuild-can' t-clean-project-with-C-COM-component-dependent-on-other-NET-library.html。在清理受此影响的解决方案之前,我尝试清理两个不同的项目,但这也失败了。如,

msbuild ".\ProjDir\MyProj.csproj" /t:clean /p:configuration=Release /fl /flp:logfile=".\..\LogFiles\msbuildClean.log";verbosity=diagnostic

我已经尝试在问题开始显示之前恢复到以前的SVN版本,但我仍然得到相同的错误。我的构建机器在虚拟机上,我甚至尝试在问题出现之前将构建机器还原为快照,但仍然会出现错误。

我已经在这里待了两个星期了,而我唯一的办法是使用devenv来清理解决方案,这非常缓慢。我此时唯一的想法是,当使用msbuild时,COM接口的依赖关系不能正确处理干净,但我不知道如何解决问题。

我可以使用VS2010 CMD提示重现问题。下面是我使用的示例cmd行

msbuild "A Solution.sln" /t:clean /p:Configuration=Release /fl /flp:logfile=".\..\LogFiles\msbuildClean.log";verbosity=diagnostic
msbuild "A Solution.sln" /t:build /p:Configuration=Release /fl /flp:logFile=".\..\LogFiles\msbuildBuild.log";verbosity=diagnostic

在vbproj文件中,存在具有Release配置条件的PropertyGroup。所有这些都包括<RegisterForComInterop>true</RegisterForComInterop>。如果我将此值设置为false,则错误消失,因为没有任何内容可以取消注册。但是,我需要.tlb个文件才能编译我们的vb6项目。

那么,对于我来说,将它设置为false然后使用Regasm在构建后注册程序集并在清理之前取消注册是否有任何问题?有没有人有任何想法为什么MSBuild在几个月内构建成功运行时会突然出现这个过程的问题?

感谢。

更新

  • 如果我使用msbuild清理第一个问题项目,这个清理工作 成功。
  • 然而第二个项目无法正常清理
  • 清洁第一个项目ProjA时,它也会删除依赖项 来自其他项目的文件,ProjB。
  • 当我清理第二个问题项目ProjC时,它也依赖于ProjB.dll,并且缺少此文件。

问题

  - 如何让MSBuild不删除其他项目所需的文件?

2 个答案:

答案 0 :(得分:1)

最后,我必须回答stijn的回答。 我从来没有找到原因 - 在msbuild清理过程中的某些东西似乎删除了取消注册程序集所需的文件。 我曾尝试创建一个msbuild任务来首先取消注册程序集,但这也失败了。 最后,我编写了一个Powershell脚本,用于搜索*.unmanagedregistration.cache文件的路径。然后,我可以从unmanagedregistration.cache文件中确定.dll文件名,然后一旦代码运行regasm /unregister,它将删除该文件。

答案 1 :(得分:0)

只需以管理员身份执行清理即可。如果使用visual studio,请以管理员身份打开它,它应该执行清理操作。