我有一个包含许多项目文件的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在几个月内构建成功运行时会突然出现这个过程的问题?
感谢。
答案 0 :(得分:1)
最后,我必须回答stijn的回答。
我从来没有找到原因 - 在msbuild清理过程中的某些东西似乎删除了取消注册程序集所需的文件。
我曾尝试创建一个msbuild任务来首先取消注册程序集,但这也失败了。
最后,我编写了一个Powershell脚本,用于搜索*.unmanagedregistration.cache
文件的路径。然后,我可以从unmanagedregistration.cache文件中确定.dll文件名,然后一旦代码运行regasm /unregister
,它将删除该文件。
答案 1 :(得分:0)
只需以管理员身份执行清理即可。如果使用visual studio,请以管理员身份打开它,它应该执行清理操作。