dotnet 编译模式使用教程

简介

.NET 中,DebugRelease 是两种常见的编译模式,它们的主要区别在于 编译优化、调试支持、性能 等方面。此外,.NET 也支持自定义编译模式,比如 StagingProduction 等,适用于不同的环境。

Debug 与 Release 模式对比

特性 Debug Release
JIT 优化 关闭优化,便于调试 启用优化,提高性能
调试符号 生成完整的 PDB 调试信息 可能不会生成完整的调试信息
断点与调试 支持完整调试 可能无法调试某些优化代码
预处理指令 DEBUG 预处理指令有效 DEBUG 预处理指令无效
性能 代码运行较慢 代码运行更快
日志 通常启用详细日志 通常减少日志输出
代码移除 不会移除 Debug.Assert 代码 移除 Debug.Assert 代码
应用场景 开发和测试阶段 生产环境部署

Debug 模式

Debug 模式主要用于开发和调试阶段,支持完整的调试信息和断点调试。

csharp 复制代码
using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        Console.WriteLine("This is Debug mode.");

        Debug.WriteLine("This message appears only in Debug mode.");
        Debug.Assert(1 + 1 == 2, "Math is broken!");
    }
}

编译结果

  • 生成 .pdb 调试符号文件,可用于 调试。

  • Debug.WriteLine 代码 在 Release 模式下不会执行。

  • Debug.Assert 代码 在 Release 模式下被移除。

Release 模式

Release 模式用于 生产环境,编译时会进行 优化,移除不必要的调试信息,提高运行效率。

csharp 复制代码
using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("This is Release mode.");

        Trace.WriteLine("This message appears in both Debug and Release modes.");
    }
}

编译结果

  • 进行 JIT 优化,提高代码运行效率。

  • Debug.WriteLine、Debug.Assert 代码 被移除。

  • Trace.WriteLine 仍然可用,可以在调试和发布时进行日志记录。

自定义编译模式

.csproj 文件中添加如下内容:

xml 复制代码
<PropertyGroup Condition="'$(Configuration)' == 'Staging'">
  <DefineConstants>STAGING</DefineConstants> <!-- 定义预处理符 -->
  <Optimize>true</Optimize> <!-- 开启优化 -->
  <DebugType>portable</DebugType> <!-- 可选: full, pdbonly, portable -->
  <PlatformTarget>AnyCPU</PlatformTarget>
  <OutputPath>bin\Staging\</OutputPath> <!-- 输出路径 -->
</PropertyGroup>

说明:

  • DefineConstants: 可在代码中使用 #if STAGING 条件编译

  • Optimize: 控制是否优化 IL 代码

  • DebugType: 控制生成哪种类型的调试信息

使用条件编译指令

csharp 复制代码
#if DEBUG
    Console.WriteLine("调试模式");
#elif STAGING
    Console.WriteLine("预发布环境(Staging)");
#elif RELEASE
    Console.WriteLine("生产环境");
#endif

命令行编译自定义模式

shell 复制代码
dotnet build -c Staging

自定义编译模式完整示例

项目结构

plaintext 复制代码
StagingSample/
├── Program.cs
└── StagingSample.csproj

StagingSample.csproj

xml 复制代码
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <RootNamespace>StagingSample</RootNamespace>
  </PropertyGroup>

  <!-- Debug 模式配置 -->
  <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <OutputPath>bin\Debug\</OutputPath>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>portable</DebugType>
    <Optimize>false</Optimize>
  </PropertyGroup>

  <!-- Release 模式配置 -->
  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <DefineConstants>RELEASE;TRACE</DefineConstants>
    <OutputPath>bin\Release\</OutputPath>
    <DebugSymbols>false</DebugSymbols>
    <DebugType>portable</DebugType>
    <Optimize>true</Optimize>
  </PropertyGroup>

  <!-- Staging 模式配置 -->
  <PropertyGroup Condition="'$(Configuration)' == 'Staging'">
    <DefineConstants>STAGING;TRACE</DefineConstants>
    <OutputPath>bin\Staging\</OutputPath>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>portable</DebugType>
    <Optimize>true</Optimize>
  </PropertyGroup>

</Project>

Program.cs

csharp 复制代码
using System;

namespace StagingSample
{
    class Program
    {
        static void Main(string[] args)
        {
#if DEBUG
            Console.WriteLine("当前是 Debug 模式");
#elif RELEASE
            Console.WriteLine("当前是 Release 模式");
#elif STAGING
            Console.WriteLine("当前是 Staging 模式");
#else
            Console.WriteLine("未知模式");
#endif
            Console.WriteLine("Hello, .NET 编译模式演示!");
        }
    }
}

编译方式

shell 复制代码
dotnet build -c Staging

输出文件会在:

shell 复制代码
bin\Staging\

运行后输出为:

text 复制代码
当前是 Staging 模式
Hello, .NET 编译模式演示!

配置环境变量和参数

Staging 配置中加载不同的配置文件(如 appsettings.Staging.json)。

json 复制代码
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ApiEndpoint": "https://staging.api.example.com"
}

在代码中加载配置

csharp 复制代码
var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json")
    .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
    .Build();

var endpoint = builder["ApiEndpoint"];
Console.WriteLine($"API 地址: {endpoint}");
相关推荐
该用户已不存在17 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net
小码编匠21 小时前
WPF 中的高级交互通过右键拖动实现图像灵活缩放
后端·c#·.net
追逐时光者1 天前
一个基于 .NET 开源、简易、轻量级的进销存管理系统
后端·.net
唐青枫1 天前
C#.NET 定时任务与队列利器:Hangfire 完整教程
c#·.net
hez20101 天前
Runtime Async - 步入高性能异步时代
c#·.net·.net core·clr
追逐时光者2 天前
.NET Fiddle:一个方便易用的在线.NET代码编辑工具
后端·.net
mudtools2 天前
.NET驾驭Word之力:玩转文本与格式
c#·.net
唐青枫2 天前
C#.NET 数据库开发提速秘籍:SqlSugar 实战详解
c#·.net
追逐时光者3 天前
精选 4 款基于 .NET 开源、功能强大的 Windows 系统优化工具
后端·.net
mudtools3 天前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net