C# 未将依赖DLL复制到Visual Studio中的生成输出文件夹

C# 未将依赖DLL复制到Visual Studio中的生成输出文件夹,c#,.net,visual-studio-2010,dll,reference,C#,.net,Visual Studio 2010,Dll,Reference,我有一个VisualStudio解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动项目,并使用其他项目。 有一个项目叫做“ProjectX”。其参考添加到主项目中。 ProjectX引用的另一个.NET dll(比如abc.dll)不是解决方案的一部分 现在这个abc.dll应该被复制到主项目的bin/debug文件夹中,但它并没有被复制到那个里。为什么它没有被复制,有任何已知的原因吗?是的,您需要将Copy Local设置为true。但是,我非常确定您还需要从主项目引用该程序集,并

我有一个VisualStudio解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动项目,并使用其他项目。 有一个项目叫做“ProjectX”。其参考添加到主项目中。 ProjectX引用的另一个.NET dll(比如abc.dll)不是解决方案的一部分


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

是的,您需要将
Copy Local
设置为
true
。但是,我非常确定您还需要从主项目引用该程序集,并将
Copy Local
设置为
true
——它不仅仅是从依赖程序集复制的


您可以通过单击
参考
下的程序集并按F4进入
复制本地
属性。

是的,您需要将
复制本地
设置为
。但是,我非常确定您还需要从主项目引用该程序集,并将
Copy Local
设置为
true
——它不仅仅是从依赖程序集复制的


通过单击
引用下的程序集并按F4键,可以访问
复制本地
属性。

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

因此,如果您没有在ProjectX中的任何位置显式使用abc.dll中的任何类型,那么请在ProjectX中的某个文件中放置一个伪声明

AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied
您不需要对每个类都执行此操作,只需执行一次就足以使DLL副本和所有内容按预期工作


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

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

因此,如果您没有在ProjectX中的任何位置显式使用abc.dll中的任何类型,那么请在ProjectX中的某个文件中放置一个伪声明

AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied
您不需要对每个类都执行此操作,只需执行一次就足以使DLL副本和所有内容按预期工作


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

遇到了同样的问题。背景信息:在构建之前,我在解决方案中添加了一个新的项目X。项目Y依赖于项目X,项目A、B、C依赖于项目Y

生成错误是找不到项目A、B、C、Y和X DLL

根本原因是新创建的Project X以.NET 4.5为目标,而其余的解决方案项目以.NET 4.5.1为目标。Project X没有生成,导致其余的项目也没有生成


确保所有新添加的项目都与解决方案的其余部分针对相同的.NET版本。

遇到了相同的问题。背景信息:在构建之前,我在解决方案中添加了一个新的项目X。项目Y依赖于项目X,项目A、B、C依赖于项目Y

生成错误是找不到项目A、B、C、Y和X DLL

根本原因是新创建的Project X以.NET 4.5为目标,而其余的解决方案项目以.NET 4.5.1为目标。Project X没有生成,导致其余的项目也没有生成


确保所有新添加的项目都指向与解决方案其余部分相同的.NET版本。

您可以将主项目和ProjectX的生成输出路径设置为同一文件夹,然后,您可以在该文件夹中获取所需的所有DLL。

您可以将主项目和ProjectX的构建输出路径设置为同一文件夹,然后您可以在该文件夹中获取所需的所有DLL。

请注意Overlard Zurg的回答

我以这种方式添加了虚拟引用,它在调试模式下工作:

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);
    }
}
公共类DummyClass
{
私有静态void Dummy()
{
动作noop==>{};
var dummy=typeof(AbcDll.AnyClass);
noop(虚拟);
}
}

这个信息实际上花了我好几个小时才弄明白,所以我想我可以分享它。

这只是祖格领主回答的旁注

我以这种方式添加了虚拟引用,它在调试模式下工作:

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);
    }
}
公共类DummyClass
{
私有静态void Dummy()
{
动作noop==>{};
var dummy=typeof(AbcDll.AnyClass);
noop(虚拟);
}
}

这个信息实际上花了我几个小时才弄明白,所以我想我可以分享它。

你也可以检查一下,确保你要找的DLL没有包含在GAC中。我相信VisualStudio很聪明,如果构建机器上的GAC中已经存在这些文件,就不要复制它们

我最近在这种情况下运行了一个SSIS包,该包需要程序集存在于GAC中。我已经忘记了这一点,并且想知道为什么那些DLL在构建过程中没有出现

要检查GAC中的内容(从Visual Studio Developer命令提示符):

或输出到文件以使其更易于读取:

gacutil -l > output.txt
notepad.exe output.txt
要删除部件,请执行以下操作:

gacutil -u MyProjectAssemblyName
我还应该注意,一旦我从GAC中删除了这些文件,它们就被正确地删除了
[assembly: ForceAssemblyReference(typeof(AbcDll.AnyClass))]
<ProjectReference Include="Project B.csproj">
  <Project>{blah blah}</Project>
  <Name>Project B</Name>
  <Private>True</Private>
</ProjectReference>