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

MSBuild clean operation fails due to missing dependency

我有一个 visual studio 2010 解决方案文件,其中包含许多项目文件。如果我使用 devenv 清理解决方案,则清理会成功完成,但是,如果我使用 MSBuild,则两个项目文件由于缺少依赖项 error MSB3395 而无法清理。如果我 运行 第二次清理,在失败后立即完成,没有错误。

我们使用 MSBuild 构建成功。

Task "UnregisterAssembly" (TaskId:204) ...

...

error MSB3395: Cannot unregister assembly "C:\Build\Dir\MyFile.dll". Could not load file or assembly 'MyOtherFile, Version=10.0.0.414, Culture=neutral, PublicKeyToken=266e457ed35afd03' or one of its dependencies. The system cannot find the file specified. [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'-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 注册程序集 post 构建,然后在清理之前取消注册,是否有任何问题?有没有人知道为什么 MSBuild 几个月来构建 运行 成功时,此过程突然出现问题?

谢谢。

更新

问题

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

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

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