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

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


当前回答

VS2019 V16.6.3

对我来说,问题是主.proj文件最终以这样的项目入口结束,其DLL没有被复制到父项目bin文件夹:

<ProjectReference Include="Project B.csproj">
  <Project>{blah blah}</Project>
  <Name>Project B</Name>
  <Private>True</Private>
</ProjectReference>

我手动删除了一行<Private>True</Private>,然后在主项目的每次构建时将DLL复制到主项目bin文件夹。

如果您转到主项目的参考文件夹中的问题项目的参考,单击它并查看属性,其中有一个“本地复制”设置。私有标记等同于这个设置,但对我来说,出于某种原因,更改本地复制对.proj文件中的私有标记没有影响。

令人恼火的是,我没有更改引用的复制本地值,不知道它是如何设置的,又浪费了一天追踪VS的愚蠢问题。

感谢所有其他帮助我了解原因的答案。

HTH

其他回答

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

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

如果右击引用的程序集,将看到名为Copy Local的属性。如果“本地复制”设置为true,则程序集应该包含在bin中。然而,Visual studio有一个问题,有时它不包括在bin文件夹中引用的dll…这是对我有效的变通方法:

我会将它添加到Postbuild事件中,以将必要的库复制到输出目录中。比如XCopy pathtolilibraries targetdirectory

你可以在项目属性>构建事件中找到它们。

TLDR;Visual Studio 2019可能只是需要重新启动。

我在使用基于Microsoft.NET.Sdk项目的项目时遇到了这种情况。

<Project Sdk="Microsoft.NET.Sdk">

具体地说:

Project1: targets.netstandard2.1 通过Nuget引用Microsoft.Extensions.Logging.Console projec2: targets.netstandard2.1 通过项目引用引用Project1 Project2Tests: targets.netcoreapp3.1 通过项目引用引用Project2

在测试执行时,我收到了错误消息,指出无法找到Microsoft.Extensions.Logging.Console,并且它确实不在输出目录中。

我决定通过将Microsoft.Extensions.Logging.Console添加到Project2中来解决这个问题,结果发现Visual Studio的Nuget Manager并没有列出安装在Project1中的Microsoft.Extensions.Logging.Console,尽管它存在于Project1中。csproj文件。

简单地关闭并重新启动Visual Studio就解决了这个问题,而不需要添加额外的引用。也许这将为某人节省45分钟的生产力损失:-)

您还可以检查以确保您正在寻找的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。