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

时间:2013-09-11 14:26:29

标签: 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等?

10 个答案:

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

设置如下:

solution-explorer-screenshot

答案 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)\

在“项目属性”的“常规”页面上。这样会将输出放在解决方案根目录下的“ bin”文件夹中,并将中间体放在“ obj”文件夹中。

注意:从命令行运行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”),在属性中选择:

  • Build Action =“HelpFiles”
  • 复制到OutputDirectory =“如果更新”

这对我来说完全符合要求 - 在构建期间,.DLL被复制到输出目录而没有“\ lib”子文件夹。