Dependent DLL is not getting copied to the build output folder in Visual Studio

I found that if ProjectX referenced the abc.dll but didn't directly use any of the types DEFINED in abc.dll, then abc.dll would NOT be copied to the main output folder. (It would be copied to the ProjectX output folder, to make it extra-confusing.)

So, if you're not explicitly using any of the types from abc.dll anywhere in ProjectX, then put a dummy declaration somewhere in one of the files in ProjectX.

AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied

You don't need to do this for every class -- just once will be enough to make the DLL copy and everything work as expected.

Addendum: Note that this may work for debug mode, but NOT for release. See @nvirth's answer for details.


Just a sidenote to Overlord Zurg's answer.

I've added the dummy reference this way, and it worked in Debug mode:

public class DummyClass
{
    private static void Dummy()
    {
        var dummy = typeof(AbcDll.AnyClass);
    }
}

But in Release mode, the dependent dll still did not get copied.
This worked however:

public class DummyClass
{
    private static void Dummy()
    {
        Action<Type> noop = _ => {};
        var dummy = typeof(AbcDll.AnyClass);
        noop(dummy);
    }
}

This infomation actually costed me hours to figure out, so I thought I share it.


Yes, you'll need to set Copy Local to true. However, I'm pretty sure you'll also need to reference that assembly from the main project and set Copy Local to true as well - it doesn't just get copied from a dependent assembly.

You can get to the Copy Local property by clicking on the assembly under References and pressing F4.


It looks slick when you make it an assembly attribute

[AttributeUsage(AttributeTargets.Assembly)]
public class ForceAssemblyReference: Attribute
{        
    public ForceAssemblyReference(Type forcedType)
    {
        //not sure if these two lines are required since 
        //the type is passed to constructor as parameter, 
        //thus effectively being used
        Action<Type> noop = _ => { };
        noop(forcedType);
    }
}

The usage will be:

[assembly: ForceAssemblyReference(typeof(AbcDll.AnyClass))]

Ran into this same issue. Background info: before building, I had added a new Project X to the solution. Project Y depended on Project X and Project A, B, C depended on Project Y.

Build errors were that Project A, B, C, Y, and X dlls could not be found.

Root cause was that newly created Project X targeted .NET 4.5 while the rest of the solution projects targeted .NET 4.5.1. Project X didn't build causing the rest of the Projects to not build either.

Make sure any newly added Projects target the same .NET version as the rest of the solution.