MSBuild 清理操作因缺少依赖项而失败。

4
我有一个包含多个项目文件的Visual Studio 2010解决方案文件。如果我使用devenv清理解决方案,那么清理将成功完成;然而,如果我使用MSBuild,则由于缺少依赖项,其中两个项目文件无法清理,出现error MSB3395。如果我在失败后立即再次运行Clean,那么清理就会成功完成,没有错误。
我们使用MSBuild构建成功了。

任务“UnregisterAssembly”(TaskId:204)...

...

错误MSB3395:无法注销程序集“C:\Build\Dir\MyFile.dll”。无法加载文件或程序集“MyOtherFile,Version=10.0.0.414,Culture=neutral,PublicKeyToken=266e457ed35afd03”或其某个依赖项。系统找不到指定的文件。[C:\Build\Dir\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-dependant-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配置条件的PropertyGroups。所有这些都包含<RegisterForComInterop>true</RegisterForComInterop>。如果我将此值设置为false,则错误会消失,因为没有任何东西需要取消注册。然而,我需要.tlb文件才能编译我们的vb6项目。
那么,如果我将其设置为false,然后在构建后使用Regasm注册程序集,并在清理之前取消注册,是否会出现问题?有人有任何想法,为什么MSBuild在几个月内成功运行构建过程的情况下,突然出现了这个问题吗?
谢谢。
更新:
- 如果我使用msbuild来清理第一个问题项目,则此清理将成功。 - 然而,第二个项目无法正确清理。 - 在清理第一个项目ProjA时,它还会从其他项目ProjB中删除依赖文件。 - 当我清理第二个问题项目ProjC时,它也依赖于ProjB.dll,但是该文件丢失了。
问题:如何使MSBuild不要删除其他项目所需的文件?

这不是一个Interop程序集。永远不要忽略“或其任何依赖项”短语。如果以错误的顺序清理文件,先尝试注销MyFile.dll之前删除依赖项,则可能会出现问题。为什么会发生这种情况,如果没有提供详细的构建跟踪,就无法猜测。 - Hans Passant
2
不知道出了什么问题,但你可以少花点时间去寻找解决方法,比如使用一个预清理目标来手动删除项目的输出。 - stijn
1
请参阅 https://github.com/Microsoft/msbuild/issues/1230 上的问题。 - DeCaf
2个回答

2
最终我必须选择stijn的答案。我从未找到原因 - 在msbuild清理过程中似乎会删除注销程序集所需的文件。我曾试图创建一个msbuild任务来先注销程序集,但那也失败了。最后,我编写了一个PowerShell脚本,在路径中搜索*.unmanagedregistration.cache文件。然后我可以从unmanagedregistration.cache文件确定.dll文件名,一旦代码运行regasm /unregister,它就会删除该文件。

0

以管理员身份执行清理操作。如果使用Visual Studio,请以管理员身份打开它,然后它应该执行清理操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接