更改生成输出目录

可以在预配置的基础上指定项目生成的输出的位置(用于调试、发布或两者)。 使用默认设置时,输出文件夹因项目类型和 SDK 而异,某些项目使用特定于平台或特定于框架的子文件夹。

Visual Studio 提供了若干属性,让你可以通过指定相对于项目文件夹的路径或文件系统中任何位置的绝对路径,将中间输出和最终输出放入自定义文件夹。 除了在 Visual Studio 项目属性中指定的设置之外,还可以通过编辑项目文件并使用 MSBuild 和 .NET SDK 的功能进一步自定义输出,从而完全控制项目输出的各个方面,无论是针对单个项目,还是包含许多项目的解决方案。

更改生成输出目录

  1. 清理项目或解决方案以移除任何现有输出文件(“生成”>“清理解决方案”)。

  2. 要打开项目的属性页面,右键单击“解决方案资源管理器”中的项目节点,然后选择“属性”

  3. 根据项目类型选择相应的选项卡:

    • 对于 C#,选择“生成”选项卡
    • 对于 Visual Basic,选择“编译”选项卡
    • 对于 C++ 或 JavaScript,选择“常规”选项卡
  4. 在顶部的配置下拉列表中,选择你想要更改其输出文件位置的配置(“调试”、“发布”或“所有配置”)

  5. 在页面上找到输出路径条目,路径条目根据项目类型而有所不同:

    • C# 和 JavaScript 项目的输出路径
    • Visual Basic 项目的生成输出路径
    • Visual C++ 项目的输出目录

    键入要生成输出的路径(绝对或相对于根项目目录),或选择“浏览”以浏览到该文件夹

    Visual Studio C# 项目的输出路径属性

    注意

    默认情况下,某些项目(.NET 和 ASP.NET Core)会在生成路径中包括框架版本或运行时标识符。 若要更改这一点,请在解决方案资源管理器中右键单击项目节点,选择“编辑项目文件”并添加以下内容

    <PropertyGroup>
      <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
      <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
    </PropertyGroup>
    

提示

如果系统未将输出生成到指定位置,请在 Visual Studio 的菜单栏上选择该位置,确保构建相应的配置(例如“调试”或“发布”)

在 Visual Studio 2019 中生成配置选取器。

生成到公共输出目录

默认情况下,Visual Studio 将解决方案中的每个项目生成到其在解决方案中自己的文件夹中。 可以通过更改项目的生成输出路径来强制将所有输出都放到相同的文件夹中。

将所有解决方案输出都放到一个共同目录中

  1. 清理解决方案以移除任何现有输出文件(“生成”>“清理解决方案”)。

  2. 单击解决方案中的项目。

  3. “项目” 菜单上,单击 “属性”

  4. 在每个项目中,根据其类型选择“编译”或“生成”,并将“输出路径”或“基本输出路径”设置为要用于解决方案中所有项目的文件夹。

  5. 打开项目的项目文件,并将以下属性声明添加到第一个属性组。

    <PropertyGroup>
      <!-- existing property declarations are here -->
      <UseCommonOutputDirectory>true</UseCommonOutputDirectory>
    </PropertyGroup>
    

    UseCommonOutputDirectory 设置为 trueVisual Studio 及其基础生成引擎 (MSBuild) 就能知道你将多个项目输出放在同一文件夹中,因此 MSBuild 会省略项目依赖于其他项目时通常发生的复制步骤。

  6. 为解决方案中的所有项目重复步骤 2-5。 如果有一些不应使用公共输出目录的异常项目,可以跳过这些项目。

设置项目(.NET 项目)的中间输出目录

  1. 清理项目以移除任何现有输出文件。

  2. 打开项目文件。

  3. 将以下属性声明添加到第一个属性组。

    <PropertyGroup>
      <!-- existing property declarations are here -->
      <IntermediateOutputPath>path</IntermediateOutputPath>
    </PropertyGroup>
    

    路径是相对于项目文件的路径,你也可以使用绝对路径。 如果要将项目名称放在路径中,可以使用 MSBuild 属性 $(MSBuildProjectName)$(MSBuildProjectDirectory) 来引用它。 有关其他可以使用的属性,请参阅 MSBuild 保留属性和已知属性

  4. 生成时,Visual Studio 仍会在项目文件夹下创建 obj 文件夹,但它为空。 可以在生成过程中将其删除。 一种方法是添加后期生成事件来运行以下命令:

    rd "$(ProjectDir)obj" /s /q
    

    请参阅指定自定义生成事件

在 Visual Studio 2022 中,有多种项目设计器用户界面,具体取决于项目类型。 C# .NET Framework 和所有 Visual Basic 项目都使用旧版 .NET 项目设计器,但 C# .NET Core(和 .NET 5 及更高版本)项目使用当前 .NET 项目设计器。 C++ 项目使用自己的属性页用户界面。 本部分中的步骤取决于所用的项目设计器。

更改生成输出目录

此过程适用于面向 .NET Core 或 .NET 5 及更高版本的 Visual Studio 2022 中的 C# 项目。

  1. 清理项目或解决方案以移除任何现有输出文件(“生成”>“清理解决方案”)。

  2. 右键单击“解决方案资源管理器”中的项目节点,然后选择“属性”。

  3. 展开“生成”部分,然后向下滚动到“输出”子部分。

  4. 找到 C# 的“基本输出路径”,然后键入要生成输出的路径(绝对或相对于根项目目录),或选择“浏览”,浏览到该文件夹。 请注意,配置名称将追加到基本输出路径,以生成实际输出路径。

    显示 .NET Core C# 项目的输出路径属性的屏幕截图。

    注意

    默认情况下,某些项目(.NET 和 ASP.NET Core)会在最终输出路径中包括框架版本或运行时标识符。 若要更改这一点,请在解决方案资源管理器中右键单击项目节点,选择“编辑项目文件”并添加以下内容

    <PropertyGroup>
      <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
      <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
    </PropertyGroup>
    

生成到公共输出目录

默认情况下,Visual Studio 将解决方案中的每个项目生成到其在解决方案中自己的文件夹中。 可以通过更改项目的生成输出路径来强制将所有输出都放到相同的文件夹中。

  1. 清理解决方案以移除任何现有输出文件(“生成”>“清理解决方案”)。

  2. 单击解决方案中的项目。

  3. “项目” 菜单上,单击 “属性”

  4. 在每个项目中,根据其类型选择“编译”或“生成”,并将“输出路径”或“基本输出路径”设置为要用于解决方案中所有项目的文件夹。

  5. 打开项目的项目文件,并将以下属性声明添加到第一个属性组。

    <PropertyGroup>
      <!-- existing property declarations are here -->
      <UseCommonOutputDirectory>true</UseCommonOutputDirectory>
    </PropertyGroup>
    

    UseCommonOutputDirectory 设置为 trueVisual Studio 及其基础生成引擎 (MSBuild) 就能知道你将多个项目输出放在同一文件夹中,因此 MSBuild 会省略项目依赖于其他项目时通常发生的复制步骤。

  6. 为解决方案中的所有项目重复步骤 2-5。 如果有一些不应使用公共输出目录的异常项目,可以跳过这些项目。

提示

如果系统未将输出生成到指定位置,请在 Visual Studio 的菜单栏上选择该位置,确保构建相应的配置(例如“调试”或“发布”)

Visual Studio 2022 中的生成配置选取器的屏幕截图。

设置项目的中间输出目录

此过程适用于面向 .NET Core 或 .NET 5 及更高版本的 Visual Studio 2022 中的 C# 项目。

  1. 清理项目以移除任何现有输出文件。

  2. 打开项目文件。

  3. 将以下属性声明添加到第一个属性组。

    <PropertyGroup>
      <!-- existing property declarations are here -->
      <IntermediateOutputPath>path</IntermediateOutputPath>
    </PropertyGroup>
    

    路径是相对于项目文件的路径,你也可以使用绝对路径。 如果要将项目名称放在路径中,可以使用 MSBuild 属性 $(MSBuildProjectName)$(MSBuildProjectDirectory) 来引用它。 有关其他可以使用的属性,请参阅 MSBuild 保留属性和已知属性

  4. 生成时,Visual Studio 仍会在项目文件夹下创建 obj 文件夹,但它为空。 可以在生成过程中将其删除。 一种方法是添加后期生成事件来运行以下命令:

    rd "$(ProjectDir)obj" /s /q
    

    请参阅指定自定义生成事件

使用 Directory.Build.props 设置输出目录

如果有大量项目,并且需要更改所有项目的输出文件夹,则使用本文前面所述的方法更改每个项目会很繁琐且容易出错。 对于这种情况,可以在解决方案文件夹 Directory.Build.props 中创建一个文件,从而在单个位置设置相应的 MSBuild 属性,以应用到解决方案中的所有项目。 通过将具有此特定名称的文件放入你希望受到影响的所有项目的父文件夹中,可以轻松地在单个位置维护自定义项,并轻松更改值。 请参阅按文件夹自定义生成

使用项目来组织生成输出

对于 .NET 8 项目,可以使用项目功能以高度可自定义和灵活的方式安排输出。 请参阅项目输出布局