views:

1690

answers:

4

I am wondering what copy-local=true for references exactly does. Does it copy the referenced assembly along with all of its dependencies to the output directory?

My scenario is the following: I have a custom log wrapper that utilizes log4net. I build a release assembly of MyLogWrapper.dll with log4net.dll reference set to copy-local true. Referencing MyLogWrapper.dll from MyProject with copy local set to true should result in log4net.dll being copied as well right? I am only referencing MyLogWrapper.dll and none of its dependencies in MyProject. log4net.dll is not being copied to MyProject output directory but all other dependencies of MyLogWrapper are. What could be the problem?

I have made some more experiments and it seems that if I remove the assembly (log4net.dll) from GAC it starts to get copied locally. Can anyone confirm that this is the problem?

A: 

When local copy is set to true it will copy all the assemmbly whose attribute local copy = tue to the bin direcory of the application.

In your case the dll might be using the other dll so it require that also.

Raj Kumar
+1  A: 

You need to be a bit wary of copy local as it has caught me out in the past!

Just occasionally, for a particular .dll it will silently fail to copy it to the build folder. Usually this doesn't show up on a dev machine as the dll's are often in the GAC as well (if you have installed a dev tool / library you are using for development) and so you don't notice until it gets distrobuted / bundled into an installer and the required files are missing on a client machine.

There is not much info on this bug, but this thread demonstrates it for a particular library: here.

Having been caught by this, I think it's a good idea (generally in any case) to know exactly which assemblies are required by your project and to have a script or similar automated action which ensures all required componants are present, either when you build, or more likely when you make an installer, or collect files for distribution,

xan
Do you recommend using vs post-build events for doing this?
Fadeproof
I have not used them, so I can't say yes or no. In the case I had, I had a NSIS script which generated the installer for the tool I was writing (a visual app).Rather than just including *.dll in the installer, I updated it to include every assembly by name, so that I was warned if any were missing.
xan
... cont. It also sourced the correct assembly from elsewhere if it was missing so that the installer generation didn't fail, but it warned that VS hadn't copied the .dll I needed.
xan
+3  A: 

After asking this question on MSDN here - it seems that this behaviour is by design. "If you deploy/copy an application that contains a reference to a custom component that is registered in the GAC, the component will not be deployed/copied with the application, regardless of the Copy Local setting."

Fadeproof
+2  A: 

Unfortunately it appears that according to the following statement taken from the MSDN documentation states that the CopyLocal functionality does not work as expected for assemblies already in the GAC.

"If you deploy an application that contains a reference to a custom component that is registered in the GAC, the component will not be deployed with the application, regardless of the CopyLocal setting. In previous versions of Visual Studio, you could set the CopyLocal property on a reference to ensure that the assembly was deployed. Now, you must manually add the assembly to the \Bin folder. This puts all custom code under scrutiny, reducing the risk of publishing custom code with which you are not familiar."

More information can be found at the following page which explains details about how project references work.

MSDN: Project References

jpierson
I've added a link below to a post I made on the DataDynamics ActiveReports for .NET 3.0 forum regarding this same issue with regards to dlls deployed with active reports. Strangely I've found that this supposed "by design" behavior seems to depend on the library being reference, for example WPFToolkit.dll seems to copy to the bin folder regardless if it is through a secondary reference.http://www.datadynamics.com/forums/124306/ShowPost.aspx
jpierson