Visual-studio – MSBuild doesn’t copy references (DLL files) if using project dependencies in solution

dependenciesmsbuildprojectreferencevisual-studio

I have four projects in my Visual Studio solution (everyone targeting .NET 3.5) – for my problem only these two are important:

  1. MyBaseProject <- this class library references a third-party DLL file (elmah.dll)
  2. MyWebProject1 <- this web application project has a reference to MyBaseProject

I added the elmah.dll reference to MyBaseProject in Visual studio 2008 by clicking "Add reference…" → "Browse" tab → selecting the "elmah.dll".

The Properties of the Elmah Reference are as follows:

  • Aliases – global
  • Copy local – true
  • Culture –
  • Description – Error Logging Modules and Handlers (ELMAH) for ASP.NET
  • File Type – Assembly
  • Path – D:\webs\otherfolder\_myPath\__tools\elmah\Elmah.dll
  • Resolved – True
  • Runtime version – v2.0.50727
  • Specified version – false
  • Strong Name – false
  • Version – 1.0.11211.0

In MyWebProject1 I added the reference to Project MyBaseProject by:
"Add reference…" → "Projects" tab → selecting the "MyBaseProject". The Properties of this reference are the same except the following members:

  • Description –
  • Path – D:\webs\CMS\MyBaseProject\bin\Debug\MyBaseProject.dll
  • Version – 1.0.0.0

If I run the build in Visual Studio the elmah.dll file is copied to my MyWebProject1's bin directory, along with MyBaseProject.dll!

However if I clean and run MSBuild for the solution (via D:\webs\CMS> C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /t:ReBuild /p:Configuration=Debug MyProject.sln)
the elmah.dll is missing in MyWebProject1's bin directory – although the build itself contains no warning or errors!

I already made sure that the .csproj of MyBaseProject contains the private element with the value "true" (that should be an alias for "copy local" in Visual Studio):

<Reference Include="Elmah, Version=1.0.11211.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\mypath\__tools\elmah\Elmah.dll</HintPath>
    **<Private>true</Private>**
</Reference>

(The private tag didn't appear in the .csproj's xml by default, although Visual Studio said "copy local" true. I switched "copy local" to false – saved – and set it back to true again – save!)

What is wrong with MSBuild? How do I get the (elmah.dll) reference copied to MyWebProject1's bin?

I do NOT want to add a postbuild copy action to every project's postbuild command! (Imagine I would have many projects depend on MyBaseProject!)

Best Solution

I just deal with it like this. Go to the properties of your reference and do this:

Set "Copy local = false"
Save
Set "Copy local = true"
Save

and that's it.

Visual Studio 2010 doesn't initially put: <private>True</private> in the reference tag and setting "copy local" to false causes it to create the tag. Afterwards it will set it to true and false accordingly.