从属DLL不被复制到Visual Studio中的生成输出文件夹

我有一个视觉工作室解决scheme。 我在解决scheme中有很多项目。 有一个主要项目是启动和使用其他项目。 有一个项目说“ProjectX”。 其参考被添加到主项目。 ProjectX引用另一个.NET dll(比如说abc.dll),它不是解决scheme的一部分。

现在这个abc.dll应该被复制到主项目的bin / debug文件夹中,但是它不会被复制到那里。 为什么它不被复制,任何已知的原因?

我发现如果ProjectX引用了abc.dll,但没有直接使用abc.dll中的DEFINEDtypes,那么abc.dll就不会被复制到主输出文件夹。 (这将被复制到ProjectX输出文件夹,使其更加混乱。)

因此,如果您没有在ProjectX中的任何地方明确使用abc.dll中的任何types,则可以在ProjectX中某个文件的某处放置一个虚拟声明。

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

你不需要为每个类都做这件事 – 只要一次就足以使DLL复制,一切按预期工作。

附录:请注意,这可能适用于debugging模式,但不适用于发行版。 有关详细信息,请参阅@ nvirth的答案。

是的,您需要将“ Copy Local设置为true 。 但是, 我敢肯定你还需要从主项目中引用该程序集,并将Copy Local设置为true – 它不会从相关程序集中Copy Local

您可以通过单击References下的程序集并按F4键进入“ Copy Local属性。

Zurg的回答只是一个旁注。

我已经用这种方式添加了虚拟引用,并且它在debugging模式下工作:

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

但在发布模式下,依赖的DLL仍然没有得到复制。
但是,这工作:

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

这个信息实际上花费了我几个小时的时间,所以我想我分享它。

跑到这个相同的问题。 背景信息:在构build之前,我已经为解决scheme添加了一个新的Project X. 项目Y依靠项目X和项目A,B,C取决于项目Y.

构build错误是无法find项目A,B,C,Y和X dll。

根本原因是新创build的Project X面向.NET 4.5,而其他解决scheme项目则面向.NET 4.5.1。 项目X没有build立,导致其余的项目也没有build设。

确保新添加的项目与解决scheme的其余部分的目标版本相同。

不知道这是否有帮助,但对我来说,很多时候我引用一个DLL(当然会自动添加到bin文件夹)。 但是,该DLL可能需要额外的DLL(取决于我使用的是什么function)。 我不想引用我的项目中的那些,因为他们只是简单地需要在我实际使用的DLL相同的文件夹中。

我通过“添加现有文件”在Visual Studio中完成此操作。 您应该能够将其添加到Add_data文件夹以外的任何位置。 我个人只是将其添加到根。

然后将该文件的属性更改为…

构build行动=无(将此设置为像内容实际上复制“根”版本的根,再加上一个副本)。

复制到输出文件夹=复制,如果较新(基本上把它放在BIN文件夹中,只有当它丢失,但不会在那之后)

当我发布..我添加的DLL只存在于BIN文件夹和发布位置的其他地方(这是我想要的)。

您也可以检查以确保您正在查找的DLL不包含在GAC中。 我相信如果Visual Studio已经存在于构build机器上的GAC中,那么它们就不会复制这些文件。

我最近在这种情况下运行了,我正在testing一个需要在GAC中存在程序集的SSIS包。 我忘记了这一点,并想知道为什么这些DLL不会出现在构build过程中。

要检查GAC中的内容(从Visual Studio开发人员命令提示符):

 gacutil -l 

或输出到一个文件,使其更容易阅读:

 gacutil -l > output.txt notepad.exe output.txt 

删除程序集:

 gacutil -u MyProjectAssemblyName 

我还应该注意到,一旦我从GAC中删除文件,它们在构build之后在\ bin目录中正确输出(即使对于在根项目中没有直接引用的程序集)。 这是在Visual Studio 2013 Update 5上。

这是对nvirth例子的轻微调整

 internal class DummyClass { private static void Dummy() { Noop(typeof(AbcDll.AnyClass)); } private static void Noop(Type _) { } } 

您可以将主项目和ProjectX的构build输出path都设置为相同的文件夹,然后您可以在该文件夹中获取所需的所有dll。

确保你使用的依赖的dll没有比你的项目的Application的目标.net框架更高的目标.net框架。

您可以通过select您的项目来检查,然后按下ALT + ENTER,然后从左侧select应用程序,然后select您的项目的目标框架。

假设,依赖的dll目标框架= 4.0和应用程序的dll目标框架= 3.5,然后将其更改为4.0

谢谢!

除了上面常见的,我有一个多项目解决scheme发布。 显然有些文件针对不同的框架。

所以我的解决scheme:属性>特定版本(假)

无需在代码中input
只是:

添加可执行项目的引用

或/和确保可执行项目中的引用"Copy Local"设置为TRUE (这是我的“ 故障 ”)似乎是这个“覆盖”基地引用的库项目中的设置…

使它成为一个assembly体属性时,看起来很光滑

 [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); } } 

用法将是:

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

将DLL作为一个现有的项目添加到其中一个项目,它应该sorting