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

Posted

技术标签:

【中文标题】由于缺少依赖项,MSBuild 清理操作失败【英文标题】:MSBuild clean operation fails due to missing dependency 【发布时间】:2017-07-19 08:42:09 【问题描述】:

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

我们使用 MSBuild 构建成功。

任务 "UnregisterAssembly" (TaskId:204) ...

...

错误 MSB3395:无法注销程序集 “C:\Build\Dir\MyFile.dll”。无法加载文件或 程序集'MyOtherFile,版本= 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 Prompt 重现该问题。下面是我使用的示例 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 文件中有具有发布配置条件的属性组。所有这些都包括<RegisterForComInterop>true</RegisterForComInterop>。如果我将此值设置为 false,那么错误就会消失,因为没有任何要注销的内容。但是,我需要 .tlb 文件来编译我们的 vb6 项目。

那么,我将其设置为 false 然后使用 Regasm 在构建后注册程序集并在清理之前取消注册对我来说有什么问题吗?有谁知道为什么在构建成功运行几个月后,MSBuild 会突然出现此过程的问题?

谢谢。

更新

如果我使用 msbuild 清理第一个问题项目,这个清理工作 成功地。 但是第二个项目未能正确清理 在清理第一个项目 ProjA 时,它还会删除依赖项 来自其他项目的文件,ProjB。 当我清理第二个问题项目 ProjC 时,它也对 ProjB.dll 有依赖,而这个文件丢失了。

问题

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

【问题讨论】:

这不是互操作程序集。永远不要忽略“或其依赖项之一”短语。如果它以错误的顺序清理文件,在尝试注销 MyFile.dll 之前删除依赖项,这可能会出错。如果不提供详细的构建跟踪,就无法猜测为什么会发生这种情况。 不知道出了什么问题,但您可能会花费(浪费)更少的时间来解决诸如预清理目标之类的解决方法,它只是手动删除项目的输出。 参见github.com/Microsoft/msbuild/issues/1230的问题 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于由于缺少依赖项,MSBuild 清理操作失败的主要内容,如果未能解决你的问题,请参考以下文章

Jeddict 插件安装失败 - Apache Netbeans 12 - 缺少“Maven Projects”插件依赖项

MSBUILD : error MSB4132: 无法识别工具版本“2.0”。可用的工具版本为 “4.0“

由于缺少 CSRF,表单验证失败

VSTS 构建失败 MSB1009 项目文件不存在

Android Build 因工件而失败 - 缺少依赖项

MSBuild 无法使用临时密钥签署 ClickOnce 清单(错误 MSB3326 和 MSB3321)