我有一个视觉工作室的解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动,并使用其他项目。 有一个项目叫“ProjectX”。其参考资料添加到主项目中。 ProjectX引用了另一个. net dll(例如abc.dll),它不是解决方案的一部分。
现在这个abc.dll应该被复制到主项目的bin/debug文件夹中,但它没有被复制到那里。为什么没有被复制,有什么已知的原因吗?
我有一个视觉工作室的解决方案。 我在解决方案中有许多项目。 有一个主要项目作为启动,并使用其他项目。 有一个项目叫“ProjectX”。其参考资料添加到主项目中。 ProjectX引用了另一个. net dll(例如abc.dll),它不是解决方案的一部分。
现在这个abc.dll应该被复制到主项目的bin/debug文件夹中,但它没有被复制到那里。为什么没有被复制,有什么已知的原因吗?
是的,您需要将“本地复制”设置为true。但是,我非常确定您还需要从主项目引用该程序集,并将Copy Local设置为true—它不仅仅是从依赖的程序集复制。
您可以通过单击References下的程序集并按F4来获得Copy Local属性。
我发现,如果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。
根本原因是新创建的项目X针对。net 4.5,而其余的解决方案项目针对。net 4.5.1。项目X没有建立,导致其他项目也没有建立。
确保任何新添加的项目与解决方案的其余部分目标相同。net版本。
只是佐格领主回答的旁注。
我以这种方式添加了虚拟引用,它在调试模式下工作:
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);
}
}
这个信息其实花了我好几个小时才弄明白,所以我想分享一下。
您还可以检查以确保您正在寻找的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。
确保您使用的依赖DLL的目标. net框架不高于项目应用程序的目标. net框架。
你可以通过选择你的项目来检查,然后按ALT+ENTER,然后从左边选择Application,然后选择项目的目标框架。
假设, 依赖DLL目标框架= 4.0和 应用程序DLL目标框架= 3.5然后将其更改为4.0
谢谢你!
不确定这对我是否有帮助,但我多次引用DLL(当然会自动将其添加到bin文件夹中)。然而,DLL可能需要额外的DLL(取决于我使用的函数)。我不想在我的项目中引用那些,因为它们只需要在我实际使用的DLL相同的文件夹中结束。
我在Visual Studio中通过“添加一个现有文件”来实现这一点。您应该能够将它添加到除Add_data文件夹之外的任何地方。就我个人而言,我只是把它加到根上。
然后将该文件的属性更改为…
Build Action = None(将此设置为Content之类的内容实际上是将“根”版本复制到根,并在Bin中添加一个副本)。
复制到输出文件夹=如果更新则复制(基本上只在它丢失时才将其放在BIN文件夹中,但在那之后就不会这样做)
当我出版…我添加的DLL只存在于BIN文件夹中,而在发布位置(这是我想要的)中没有其他地方。
在代码中不需要dummy 只是:
向可执行项目添加引用
或/并确保在可执行项目中的引用有“复制本地”设置为TRUE(这是我的“错误”),似乎这“覆盖了”在基本引用库项目中的设置…
这是对nvirth示例的轻微调整
internal class DummyClass
{
private static void Dummy()
{
Noop(typeof(AbcDll.AnyClass));
}
private static void Noop(Type _) { }
}
当您将其设置为程序集属性时,它看起来很流畅
[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
你可以在项目属性>构建事件中找到它们。
在我的例子中,这是最愚蠢的事情,由TFS/VS的默认行为引起的,我不同意。
由于添加dll作为主项目的引用没有工作,我决定将其添加为“现有项”,复制本地=始终。即使那时文件也不在那里。
事实证明,即使文件出现在VS解决方案中,并且在本地和服务器上编译了所有内容,VS/TFS并没有将该文件添加到源代码控制中。它根本不包括在“未决更改”中。我不得不手动打开源代码管理资源管理器,并明确地单击“将项目添加到文件夹”图标。
愚蠢,因为我已经在vs中开发了15年,我以前遇到过这种情况,我只是不记得了,不知为何我错过了它,因为所有东西仍然编译,因为文件是常规引用,但被添加为Existing Item的文件没有被复制,因为它不存在于源代码控制服务器上。
我希望这能节省一些时间,因为我失去了2天的生命。
问题:
在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/
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分钟的生产力损失:-)
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我已经包括在项目作为内容和“复制始终”设置,没有被复制到bin文件夹。我通过在app.config中添加一个dependentAssembly引用来解决这个问题。