views:

944

answers:

4

How can I set up a project in Visual Studio to copy the third-party DLLs that one of the project's references depends on?

I have a main application project and a class library DLL. The main application references the class library DLL, and the DLL itself references some third-party DLLs. When I compile the main application, it automatically copies the class library DLL to its output directory, but it does not copy the third-party DLLs.

I do not want to add references to the third-party DLLs from the main application project because the main application does not use them, they're only used by the class library.

A: 

I'm not really aware of any way to do this other than adding a reference to said .dll in the project itself. We've run across this in some of our own projects here, and the only solution we've found is to add the reference. I want to say that one of our developers did some research and found this to be the only solution, but don't quote me on that.

James McConnell
we found that doing a pre or post build task was the only way to accomplish this.
krystan honour
+3  A: 

Create a post-build event that copies the DLL's, you don't need to reate a project just to do that.

Otávio Décio
This method allows me to keep the main application's actual dependencies separate from the class library's dependencies. Too bad there's not an automatic way (that doesn't introduce psuedo references in the main application).
emddudley
+6  A: 

You can achieve this with the project properties window. Visual Studio allows you to define events to occur, before, or after building. To get to the project properties window simply right-click on your project in the solution explorer window and click on 'properties'. From the left hand side go to the 'build events' tab.

In the post-build box type in a few copy commands. For example:

copy "$(SolutionDir)mydll.dll" "$(TargetDir)"

Where $(SolutionDir) and $(TargetDir) are both predefined variables. The standard syntax is as follows:

copy "source directory and file name" "destination directory"

If you click on the 'edit post build...' button it will bring up a box which has a listing of these predefined variables that you can insert (like $(SolutionDir) and $(TargetDir))

As a side note, this is a useful process for copying other files, such as custom configuration files, images, or any other dependencies your project may have.

Brian
A: 

I would not recommend doing this. You end up with an N^2 explosion in the number of assemblies being copied around (and potentially, being rebuilt). If possible, you should have all of your projects place their assemblies in the same $(OutDir). If you're using TFS, Team Build does this for you.

Richard Berg
Actually we do have all our assemblies being placed in one directory. My main application references them there, and when I build it copies them automatically from that directory to bin/Debug. I wanted a way for the dependecies' dependencies to get copied as well.
emddudley