Visual Studio:如何"复制到输出目录"而不复制文件夹结构?

OhD*_*ear 91 c# visual-studio-2010

我的项目文件夹的\ 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等?

小智 218

而不是<Content>使用<ContentWithTargetPath>并指定目标路径,如下所示:

<ContentWithTargetPath Include="lib\some_file.dat">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  <TargetPath>some_file.dat</TargetPath>
</ContentWithTargetPath>
Run Code Online (Sandbox Code Playgroud)

请注意,此条目可能在Visual Studio(2012,2015,2017)中不可见,但一旦手动添加到csproj,它将显示在Visual Studio中.但是,目标路径不能通过UI进行编辑.

  • 我唯一担心的是,MSBuild/.NET/Visual Studio/Whatever的未来版本将不再支持这一点,因为VS2015 UI不显示此选项或TargetPath属性. (9认同)
  • 请注意,使用 `ContentWithTargetPath` 会破坏增量编译(在 VS 2017 15.9.9 上测试) (3认同)
  • 我没有在VS 2015中看到ContentWithTargetPath作为Build Action选项.有没有办法添加它? (2认同)
  • ContentWithTargetPath 也可以通过这种方式处理多个文件: `&lt;ItemGroup&gt; &lt;ContentWithTargetPath Include="lib\**"&gt; &lt;CopyToOutputDirectory&gt;PreserveNewest&lt;/CopyToOutputDirectory&gt; &lt;TargetPath&gt;%(Filename)%(Extension)&lt;/TargetPath&gt; &lt; /ContentWithTargetPath&gt; &lt;/ItemGroup&gt;` (2认同)

Ani*_*Ani 24

保留它们$(ProjectDir)\Lib,但将这些文件" 作为链接 "添加到.csproj的根目录中.现在,他们将被复制到bin\Debug(或任何其他输出文件夹),而不是在lib中.

编辑:当我正在使用的VS/MSBuild版本中没有ContentWithTargetPath时,这个答案就回来了.将这个答案留给那些可能不得不使用旧版VS的人.请停止对此发表评论,我们都知道现在有更好的方法.

  • 谢谢ananthonline.我尝试了你的步骤,但没有帮助.可能是我做错了什么.这就是我正在做的事情,如果您认为某些内容不正确,请更正:1.从项目中排除这些dll但让它们在lib中2.右键单击项目并"添加现有项目".从lib中选择dll并将它们"添加为链接"3.右键单击dll,然后再次选择"复制到输出目录"中的"始终复制".4.清洁和重建.结果:我再次在\ bin\release\lib中获得了这些dll (4认同)
  • 如果我尝试添加项目树中已有文件的链接,它会拒绝,而只是将文件再次包含到项目中... (2认同)
  • 就像@Nyerguds 一样,我遇到的问题是您无法添加指向项目树中已有文件的链接,因此这个答案无法解决问题。 (2认同)

son*_*nny 19

如果您的主要目的是在不使项目根目录混乱的情况下包含 DLL,另一种解决方案是将 DLL 移动到单独的共享项目并将其添加为原始项目中的引用。

(请注意,这篇文章没有直接回答这个问题,因为它不保留文件夹和项目结构,但我发现这种方法很有用,因为我能够在我的案例中重组我的项目,并且因为我想避免一些此处其他方法的缺点。)

脚步

  • 右键单击您的 Solution -> Add -> New Project -> Shared Project
  • 将 DLL 添加到此项目(在此项目的根目录中,而不是在“lib”子文件夹中)
  • (检查 DLL 文件属性设置是否正确,例如Build Action: ContentCopy to Output Directory: Copy Always
  • 右键单击原始项目的 References -> Add Reference -> Shared Projects
  • 选择之前创建的共享项目

设置如下所示:

解决方案资源管理器截图

  • 到目前为止,这是保持项目整洁的简单而优雅的解决方案。 (3认同)

eri*_*_nw 7

添加dll文件作为项目的引用,并在引用集"Copy local"上添加为true.

  • @MAnthony:只能将.NET程序集或COM互操作程序集添加为项目引用; 原生DLL不能.您需要找到一些其他方法将DLL复制到\ bin\Release. (6认同)

tro*_*foe 7

在此,如果您想包含整个内容目录并且不想跟踪 Visual Studio 中的每个单独文件,那么您可以将其添加到您的项目文件中(对我来说这是一个.vcxproj文件UWP C++ 项目的一部分):

<ItemGroup>
    <Content Include="Content\**">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

请注意,该Content目录必须与项目文件位于同一目录中,才能保留目录结构。


dev*_*ria 6

如果需要将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>
Run Code Online (Sandbox Code Playgroud)

到任何其他文件夹,包括 Libs(RecursiveDir) 文件夹

<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="mycustomfolder\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)