Zoltán Tamási
Zoltán Tamási

Reputation: 12809

How to make Visual Studio resolve and include all the dependencies of my project during build?

I have a large solution currently under VS2010, with lots of projects and dependencies. Some of them are installed to the GAC, some of them are just included from a "lib" folder. I need to build one of my projects (specifically a WinForms app) to able to run on any, non-development computers without any installation process (except for the .NET runtime of course), just as portable apps do.

For this to work, I need to have all of the referenced DLLs and their whole dependency tree in the output folder of my EXE. I can do it for exemple by marking the dependencies to "Copy local" in the properties window, but that works only for the direct references of the EXE project, so it's far not enough. Another way is to make a setup project, but my client and also I want to avoid that (in the final version I'm gonna use ClickOnce). Of course I can always do it purely by hand, gathering all the DLLs manually, but that's quite a nightmare.

Is there some tool, msbuild trick, command-line option, whatever hack to force Visual Studio to gather the whole dependency tree of my EXE during build, and copy them to the output folder? So that I could just ZIP everything together and send to my client.

Upvotes: 21

Views: 59806

Answers (3)

Matt Penner
Matt Penner

Reputation: 1124

Check out the Fody/Costura recommendation from this question: Embedding DLLs in a compiled executable

It's great! I just tried it out for a similar need and in less then a few minutes I had a completely portable (except the .Net framework) exe that I could easily give to co-workers.

Upvotes: 0

Yair Nevet
Yair Nevet

Reputation: 13013

Basically, using Visual Studio, you can set all of your Solution's Projects to build into the same Output folder and use this folder as your Windows Form application folder (where the application EXE will reside).

By doing this, you will coordinate all of the possible assemblies references that your app is depend on.

In VS 2012, right-click on a Project => Properties => Select Build (left pane) => Set your Output path:

Output path in VS 2012

I would select a a solution-level folder as the Output path.

And if it's prohibited to perform such a modification at your workplace so I would suggest you to use dependency analysis tools like the following in order to interrogate and gather the appropriate assemblies that your app is depend on and will require at run-time:

Update:

Using the above mentioned tools will not yields assemblies references which are late-bounded (at run-time), for this case you may use: Fusion (the Assembly Binding Log Viewer)

Upvotes: 1

Zoltán Tamási
Zoltán Tamási

Reputation: 12809

I actually chose a somewhat "middle" solution, the following way.

  1. I created a "dummy" setup project, not caring about setting anything but adding the project outputs (primary output, localized resources, contents, etc.). It was a 2 minute task this way.
  2. I built the setup project, and got the MSI file as the output.
  3. I've extracted the contents of the MSI file to a specific folder, called "MyAppPortable" for example. I found the solution here. The command-line command is

    msiexec /a "absolute_path_to_my_MSI_output" /qb TARGETDIR="absolute_path_to_my_desired_output_folder"

  4. I got the full application with all of its resolved dependencies (except for late-binding dependencies, but I took care of them manually, by adding them as references to my projects). I could ZIP the whole folder, put it on another computer, and voila, everything worked fine.

Upvotes: 1

Related Questions