我有一个视觉工作室的解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动,并使用其他项目。 有一个项目叫“ProjectX”。其参考资料添加到主项目中。 ProjectX引用了另一个. net dll(例如abc.dll),它不是解决方案的一部分。
现在这个abc.dll应该被复制到主项目的bin/debug文件夹中,但它没有被复制到那里。为什么没有被复制,有什么已知的原因吗?
我有一个视觉工作室的解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动,并使用其他项目。 有一个项目叫“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
其他回答
只是佐格领主回答的旁注。
我以这种方式添加了虚拟引用,它在调试模式下工作:
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);
}
}
这个信息其实花了我好几个小时才弄明白,所以我想分享一下。
是的,您需要将“本地复制”设置为true。但是,我非常确定您还需要从主项目引用该程序集,并将Copy Local设置为true—它不仅仅是从依赖的程序集复制。
您可以通过单击References下的程序集并按F4来获得Copy Local属性。
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
确保您使用的依赖DLL的目标. net框架不高于项目应用程序的目标. net框架。
你可以通过选择你的项目来检查,然后按ALT+ENTER,然后从左边选择Application,然后选择项目的目标框架。
假设, 依赖DLL目标框架= 4.0和 应用程序DLL目标框架= 3.5然后将其更改为4.0
谢谢你!
您还可以检查以确保您正在寻找的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。