更改生成输出目录

可以按配置指定项目生成的输出位置(用于调试、发布或两者)。 使用默认设置时,输出文件夹因项目类型和 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 设置为 true 告知 Visual 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 中,根据项目类型,存在不同的项目设计器用户界面。 .NET Framework 项目使用旧的 .NET 项目设计器,但 .NET Core(和 .NET 5 及更高版本)项目使用当前的 .NET 项目设计器。 C++项目使用自己的属性页用户界面。 本部分中的步骤取决于所使用的项目设计器。

更改生成输出目录

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

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

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

  3. 对于 C# 项目,展开 构建 部分,然后向下滚动到 输出 小节。 对于 Visual Basic,展开“编译”部分,然后在“常规”下查看

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

    C#:

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

    Visual Basic:

    显示 .NET Core Visual Basic 项目的“输出路径”属性的屏幕截图。

    说明

    某些项目(.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 设置为 true 告知 Visual Studio 及其基础生成引擎(MSBuild)将多个项目输出放在同一文件夹中,因此 MSBuild 省略项目依赖于其他项目时通常发生的复制步骤。

  6. 对解决方案中的所有项目重复步骤 2-5。 如果你有一些不应使用常见输出目录的特殊项目,则可以跳过某些项目。

提示

如果输出未生成到您指定的位置,请通过在 Visual Studio 菜单栏上选择对应的配置(例如,DebugRelease)来确保构建正确的配置。

Visual Studio 2022 中的构建配置选择器的屏幕截图。

设置项目的中间输出目录

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

  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 项目,可以使用工件功能来以高度可自定义和灵活的方式组织输出。 请参阅项目输出布局