由于缺少依赖项,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 清理第一个问题项目,这个清理工作
成功地。
- 然而,第二个项目未能正确清理
- 清理第一个项目 ProjA 时,它还会删除依赖项
来自其他项目的文件,ProjB。
- 当我清理第二个问题项目 ProjC 时,它也依赖于 ProjB.dll,并且缺少此文件。
问题
- 如何防止 MSBuild 删除其他项目所需的文件?
最后我不得不接受stijn的回答。
我从来没有找到原因 - msbuild clean 过程中的某些东西似乎删除了注销程序集所需的文件。
我曾尝试创建一个 msbuild 任务来先注销程序集,但也失败了。
最后,我编写了一个 Powershell 脚本,用于搜索 *.unmanagedregistration.cache
文件的路径。然后我可以从 unmanagedregistration.cache 文件中确定 .dll 文件名,然后一旦代码运行 regasm /unregister
,它就会删除该文件。
只需以管理员身份执行清理即可。如果使用 visual studio,以管理员身份打开它,它应该执行清理操作。
我有一个 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 清理第一个问题项目,这个清理工作 成功地。
- 然而,第二个项目未能正确清理
- 清理第一个项目 ProjA 时,它还会删除依赖项 来自其他项目的文件,ProjB。
- 当我清理第二个问题项目 ProjC 时,它也依赖于 ProjB.dll,并且缺少此文件。
问题
- 如何防止 MSBuild 删除其他项目所需的文件?最后我不得不接受stijn的回答。
我从来没有找到原因 - msbuild clean 过程中的某些东西似乎删除了注销程序集所需的文件。
我曾尝试创建一个 msbuild 任务来先注销程序集,但也失败了。
最后,我编写了一个 Powershell 脚本,用于搜索 *.unmanagedregistration.cache
文件的路径。然后我可以从 unmanagedregistration.cache 文件中确定 .dll 文件名,然后一旦代码运行 regasm /unregister
,它就会删除该文件。
只需以管理员身份执行清理即可。如果使用 visual studio,以管理员身份打开它,它应该执行清理操作。