it helps some times You can override the $(OutDir) property globally and keep CopyLocal enabled. Since every project is copying to the same $(OutDir), you won't end up with too much duplication. This is pretty straight forward. Much more involved, you can also create a shared import file that wires into the standard build and performs a custom post-build deployment. For example,
... copy all output files ...
e.g. use wildcards $(OutDir)\*.dll
e.g. copy referenced assemblies and copy, see below
Check CopyLocal property of all references post/during build in multi project solution (Multi Xap)
Hope that helps I am using a different path now to do this. I have a base class that I can use to write unit tests that have access to the DTE2 object. This way I dont need an addin. This also works for Silverlight projects since the test class does not actually need access to the Silverlight projects, just being in the solution is enough to be able to iterate through the projects and check the references.
How to getType from a reference dll when copylocal property is false
To fix the issue you can do Typically, a bin folder is intended as the main component of your deployment package. In a very simple application deployment, everything a program needs exists in the bin folder. You could copy paste that folder anywhere and it would work. Of course, that won't happen if your external assembly isn't there. You find that those assemblies shouldn't exist in 2 places on your development machine, and I understand why you don't like that. The reason CopyLocal is set to true by default is because the typical scenario I described above is worth the cost of having assemblies existing twice in a development machine. Typically, an application will exist on many times more client machines than development machines, so the simplicity of a single deployment folder is worth the cost of disk space on dev machines.