.net core DefineConstants可以使用Run命令,但不能使用Build命令

.net core DefineConstants可以使用Run命令,但不能使用Build命令,.net-core,.net Core,我正在努力理解dotnet run和dotnet build命令之间在.csproj文件中定义的常量方面的区别 example.csproj Exe netcoreapp3.1 美元(定义常量);包括测试 program.cs 使用系统; 名称空间定义示例 { 班级计划 { 静态void Main(字符串[]参数) { #如果包括测试 Console.WriteLine(“成功了!”); #恩迪夫 控制台。WriteLine(“你好,世界!”); } } } 如果我运行dotnet run

我正在努力理解
dotnet run
dotnet build
命令之间在
.csproj
文件中定义的常量方面的区别

example.csproj


Exe
netcoreapp3.1
美元(定义常量);包括测试
program.cs

使用系统;
名称空间定义示例
{
班级计划
{
静态void Main(字符串[]参数)
{
#如果包括测试
Console.WriteLine(“成功了!”);
#恩迪夫
控制台。WriteLine(“你好,世界!”);
}
}
}
如果我运行
dotnet run-c测试,->
它工作了!你好,世界

如果我运行
dotnet build-c测试
,那么
dotnet运行{buildpath}
->
Hello World


为什么在我运行build命令时定义的常量会丢失?

dotnet build
dotnet run
都是与csproj文件相关的命令,而不是dll或可执行文件。
dotnet build
将调用
dotnet restore
命令,然后生成项目。
dotnet run
将调用
dotnet build
命令(这对于您的问题很重要),然后运行生成的dll或exe

您当前通过调用
dotnet build-c Test
dotnet run
告诉dotnet执行的操作是:

  • 清理、恢复、构建(使用“测试”配置)
  • 清理、还原、生成、运行(未指定配置)
  • 第二次清理将清理第一次生成生成的文件,然后作为run命令的一部分再次生成,但没有指定测试配置,从而导致观察到的行为

    您可以将
    dotnet-run
    更改为
    dotnet-run--no-build
    ,告诉它假设构建已经完成,并且只假设已经创建的文件存在且正确

    或者,假设您的项目有一个
    OutputType
    Exe
    ,您可以在第二步中以常规方式调用build命令生成的可执行文件。i、 e.使用命令
    example.exe

    如果未指定您的
    输出类型
    ,或默认(
    ),则这将生成一个dll而不是exe,您可以使用
    dotnet
    命令运行它:
    dotnet example.dll

    有关各种命令和常用属性的有用信息:


    我不是.net开发人员,但看起来这个常量应该可以用于调试构建,这就是为什么在生产构建中看不到它的原因。这些常量通常用于记录调试信息并在构建中包含测试。只想添加一件事:如果您自己正在执行
    dotnet bulid
    和/或
    dotnet publish
    ,您可以直接运行dll以避免
    dotnet run
    dotnet bin/../example.dll
    。请注意,这只是
    dotnet example.dll
    ,而不是
    dotnet run example.dll
    (省略
    run
    )。