Daniel Lee
Daniel Lee

Reputation: 694

MSBuild clean operation fails due to missing dependency

I have a visual studio 2010 solution file containing a number of project files. If I clean the solution using devenv then the clean completes successfully, however, if I use MSBuild, two of the project files fail to clean due to a missing dependency, error MSB3395. If I run Clean a second time, immediately after the failure, the clean completes without errors.

Our build using MSBuild succeeds.

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]

Yes, this assembly is a COM interop assembly and so the build registers the assembly. If I delete the UnmanagedRegistration.cache files associated with the two problem areas then the clean finishes without problems. However, these files are not unregistered and registry fills up with old COM registrations. I am not certain of the impact on future builds either.

I have read the article for VS2008 projects here https://blogs.msdn.microsoft.com/visualstudio/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe/ However, I don't think this applies in this case because this build process has been cleaning and building properly for months.

I have also read: https://www.experts-exchange.com/questions/26259422/msbuild-can't-clean-project-with-C-COM-component-dependant-on-other-NET-library.html. I attempted to clean the two different projects before cleaning the solution affected by this, but this too failed. e.g.,

msbuild ".\ProjDir\MyProj.csproj" /t:clean /p:configuration=Release /fl /flp:logfile=".\..\LogFiles\msbuildClean.log";verbosity=diagnostic

I have tried reverting to a previous SVN revision before the problem began to show but I still get the same error. My build machines are on Virtual Machines, and I even tried reverting the build machine to a snapshot prior to the problem showing up, but still the error would show up.

I have been at this for two weeks now, and my only recourse is to use devenv to clean the solution, which is very slow. My only idea at this time is that when using msbuild that dependencies for COM interfaces are not handled correctly for a clean but I have no idea how to fix the problem.

I can reproduce the problem using the VS2010 CMD Prompt. Below is an example cmd line that I use

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

Within the vbproj files there are PropertyGroups with a Release configuration condition. All of these include <RegisterForComInterop>true</RegisterForComInterop>. If I set this value to false, then the error goes away because there isn't anything to unregister. However, I need the .tlb files in order to compile our vb6 project.

So, are there any problems for me to just set this to false and then use Regasm to register the assemblies post build, and unregister before a clean? Does anyone have any ideas why MSBuild would suddenly have problems with this process when for months the build has run successfully?

Thanks.

UPDATE

QUESTION

- How do I keep MSBuild from removing files required by other projects?

Upvotes: 4

Views: 1848

Answers (2)

Daniel Lee
Daniel Lee

Reputation: 694

In the end I have to go with stijn's answer. I never did find the cause - something in the msbuild clean process seems to delete the files required to unregister an assembly. I had tried to create a msbuild task to unregister the assemblies first, but that too failed. In the end I coded a Powershell script that searched a path for *.unmanagedregistration.cache files. I then can determine the .dll file name from the unmanagedregistration.cache file and then once the code runs regasm /unregister, it will remove the file.

Upvotes: 2

omarmallat
omarmallat

Reputation: 734

Just perform the clean as administrator. If using visual studio, open it as administrator and it should perform the clean action.

Upvotes: 0

Related Questions