我的项目文件夹的\ lib文件夹中有几个dll文件。在dll的属性页面中,我选择“Build Action”作为“Content”和“Copy to Output Directory”作为“Copy always”。
构建之后,我实际上已经复制了dll,但是它们位于\ bin \ Release \ lib中,而不是在\ bin \ Release中。
有没有办法将dll文件复制到\ bin \ Release(而不是\ bin \ Release \ lib)而不编写后期构建脚本或使用nant等?
答案 0 :(得分:195)
而不是<Content>
使用<ContentWithTargetPath>
并指定目标路径,如下所示:
<ContentWithTargetPath Include="lib\some_file.dat">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>some_file.dat</TargetPath>
</ContentWithTargetPath>
请注意,Visual Studio(2012,2015,2017)可能无法显示此条目,但一旦手动添加到csproj,它将显示在Visual Studio中。但是目标路径不能通过UI编辑。
答案 1 :(得分:20)
将它们保存在$(ProjectDir)\Lib
中,但将这些文件“As a link”添加到.csproj的根目录中。现在,它们将被复制到bin \ Debug(或任何其他输出文件夹),而不是在lib中。
编辑:当我在使用的VS / MSBuild版本中没有ContentWithTargetPath时,这个答案就回来了。将这个答案留给那些可能不得不使用旧版VS的人。请停止对此发表评论,我们都知道现在有更好的方法。
答案 2 :(得分:6)
添加dll文件作为项目的引用,并在参考集“Copy local”上添加为true。
答案 3 :(得分:2)
在VisualStudio 2015中,如果您在“添加链接”的dll是同一项目的子文件夹中的 ,它们将自动放入文件夹,并且输出也会被放置在你看到的文件夹中。
如果dll位于磁盘上的另一个项目或目录中,而不在项目的子文件夹中,则可以“添加链接”,它们将被放入根目录中。
答案 4 :(得分:2)
如果主要目的是在不使项目根目录混乱的情况下包含DLL,则另一种解决方案是将DLL移动到单独的共享项目,并将其作为引用添加到原始项目中。 / p>
(请注意,本文并未直接回答此问题,因为它不保留文件夹和项目结构,但是我发现这种方法很有用,因为我能够根据自己的情况来重组项目,并且我想避免这里其他方法的一些缺点。)
步骤
Solution -> Add -> New Project -> Shared Project
Build Action: Content
和Copy to Output Directory: Copy Always
)References -> Add Reference -> Shared Projects
设置如下:
答案 5 :(得分:1)
要将我的帽子添加到这里,如果您想包含整个目录的内容并且不想在 Visual Studio 中跟踪每个单独的文件,那么您可以将其添加到您的项目文件中(对我来说,这是是 UWP C++ 项目的 .vcxproj
文件):
<ItemGroup>
<Content Include="Content\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
请注意,Content
目录必须与项目文件在同一目录中,以保留目录结构。
答案 6 :(得分:0)
如果需要将文件从Libs目录复制到根文件夹VS2017:
<ItemGroup Condition="'$(Platform)' == 'x64'">
<None Include="Libs\x64\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x86'">
<None Include="Libs\x86\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
到任何其他文件夹,包括Libs(RecursiveDir)文件夹
<ItemGroup Condition="'$(Platform)' == 'x86'">
<None Include="Libs\x86\**" Link="mycustomfolder\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
答案 7 :(得分:0)
另一种方法是将项目保留为None
类型。在解决方案资源管理器中,单击要部署的资源,并将Content
属性设置为True
。
注意:我是在VS2019中做到的,事情可能会因版本而异。
要使其正常工作,现在右键单击您的项目,然后选择“卸载项目”。然后右键单击已卸载的项目,然后选择“编辑project_name.vcxproj”。
在编辑器中,一直移至文件底部,然后在尾随</Project>
标签之前插入该目标:
<Target Name="CopyContent" AfterTargets="Build">
<Copy SourceFiles="@(None)" Condition="'%(None.DeploymentContent)' == 'true'" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
</Target>
现在,右键单击已卸载的项目,然后选择“重新加载项目”。如果出现提示,请选择保存并关闭。
我还将OutputDirectory
设置为:
$(SolutionDir)bin\$(Configuration)\$(Platform)\
和IntermediateDirectory
用于:
$(SolutionDir)obj\$(Configuration)\$(ProjectName)\$(Platform)\
注意:从命令行运行MSBuild时,未定义$(SolutionDir)
。您可以使用一个技巧来使用GetDirectoryNameOfFileAbove将其定义为.sln文件所在的文件夹。 (留给读者练习)。此外,看起来他们在2019年仍然在命令行上正确处理了此问题。是的:) $(SolutionDir)
包含一个反斜杠,因此后面没有反斜杠。每个结果必须有一个反斜杠。
现在,如果您拥有Pro或更高版本,请不要在每次需要创建项目时都这样做。那真是la脚。相反,一旦按照自己喜欢的方式设置了项目,请选择Project -> Export Template
。给它起一个名字,下一次要创建一个与该名字相同的项目时,只需在“新建项目”对话框中选择该名字即可。 (在旧版本中,我认为这是Files -> Export Teamplate...
。)
答案 8 :(得分:0)
关于您的问题,以下步骤在 Visual Studio 2019 中对我有用:
在 Visual Studio 编辑器中,对于您的 dll,将“构建操作”设置设置为“内容”(这可能是可选的)并将 “复制到输出目录” 设置为“”请勿复制”。
然后将在项目 csproj 文件中生成以下内容:
<ItemGroup>
<Content Include="lib\IncludedDLL.dll" />
</ItemGroup>
改为将条目修改为以下内容:
<ItemGroup>
<Content Include="lib\IncludedDLL.dll" />
<Content Include="lib\IncludedDLL.dll">
<Link>IncludedDLL.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
您可以手动将项目csproj文件中的“CopyToOutputDirectory”选项设置为“始终”或“保留最新”。
在 Visual Studio 编辑器中,它仍然会显示文件“复制到输出目录”设置为“不复制”,但文件将被复制到重建时的根输出目录。
如果不想将文件复制到输出根目录,则不需要上述更改,因此如果是这种情况,则只需在项目csproj文件中手动删除上述更改即可恢复为非复制行为。
答案 9 :(得分:-1)
我在Visual Studio 2010 / C#Project中遇到了同样的问题。
对于程序集(即具有.NET接口),请在解决方案资源管理器中的项目下使用文件夹“References”。右键单击它,选择“添加现有项目”并找到.dll程序集。
常见的.dll文件可以放在子文件夹中(如上面提到的“\ lib”),在属性中选择:
这对我来说完全符合要求 - 在构建期间,.DLL被复制到输出目录而没有“\ lib”子文件夹。