从属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