我有一个视觉工作室的解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动,并使用其他项目。 有一个项目叫“ProjectX”。其参考资料添加到主项目中。 ProjectX引用了另一个. net dll(例如abc.dll),它不是解决方案的一部分。

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


当前回答

问题:

在NuGet包DLL (Newtonsoft.json.dll)中遇到类似的问题,其中构建输出不包括引用的DLL。但是编译过程进行得很顺利。

Fix:

在文本编辑器中浏览你的项目,并在其中寻找带有“Private”标签的引用。像真或假。“私有”是“本地复制”的同义词。在操作的某个地方,MSBuild正在定位依赖项,它在其他地方找到你的依赖项,并决定不复制它。

因此,检查每个.csproj/。Vbproj文件,并手动删除标签。在Visual Studio和MSBuild中,一切都可以正常工作。一旦你让它工作,你可以返回并更新到你认为他们需要的地方。

参考:

https://www.paraesthesia.com/archive/2008/02/13/what-to-do-if-copy-local-works-in-vs-but.aspx/

其他回答

您还可以检查以确保您正在寻找的dll不包含在GAC中。我相信Visual Studio很聪明,不会复制那些已经存在于构建机器的GAC中的文件。

我最近在测试一个SSIS包时遇到了这种情况,该包需要在GAC中存在程序集。我后来忘记了这一点,并想知道为什么这些dll在构建过程中没有出现。

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

gacutil -l

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

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

移除一个组件:

gacutil -u MyProjectAssemblyName

我还应该注意到,一旦我从GAC中删除了文件,它们就会在构建后正确地输出到\bin目录中(即使对于根项目中没有直接引用的程序集也是如此)。这是在Visual Studio 2013更新5。

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

您可以通过单击References下的程序集并按F4来获得Copy Local属性。

当您将其设置为程序集属性时,它看起来很流畅

[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))]

问题:

在NuGet包DLL (Newtonsoft.json.dll)中遇到类似的问题,其中构建输出不包括引用的DLL。但是编译过程进行得很顺利。

Fix:

在文本编辑器中浏览你的项目,并在其中寻找带有“Private”标签的引用。像真或假。“私有”是“本地复制”的同义词。在操作的某个地方,MSBuild正在定位依赖项,它在其他地方找到你的依赖项,并决定不复制它。

因此,检查每个.csproj/。Vbproj文件,并手动删除标签。在Visual Studio和MSBuild中,一切都可以正常工作。一旦你让它工作,你可以返回并更新到你认为他们需要的地方。

参考:

https://www.paraesthesia.com/archive/2008/02/13/what-to-do-if-copy-local-works-in-vs-but.aspx/

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