System.Diagnostics.Debug.Assert - 如何在 .NET Core 控制台应用程序中禁用?

System.Diagnostics.Debug.Assert - how to disable in a .NET Core console app?

考虑以下简单程序:

using System;

namespace DebugAssertTesting
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Debug.Assert(6 == 7, "Bang!");
            Console.WriteLine("Hello World!");
        }
    }
}

当编译为 .NET Framework 控制台应用程序并执行时,会显示断言触发器和断言 UI 对话框。 (断言失败。中止、重试、忽略等) 通过添加包含以下内容的 App.Config 文件,禁用断言 UI 并显示 "Hello World!"。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.diagnostics>
    <assert assertuienabled="false" />
  </system.diagnostics>
</configuration>

当相同的代码被编译为 .NET Core 控制台应用程序并执行时,断言触发并且应用程序终止。控制台显示的不是 UI 对话框:

Process terminated. Assertion failed.
Bang!
   at DebugAssertTesting.Program.Main(String[] args) in C:\Development\DebugAssert\DebugAssert\Program.cs:line 9

C:\Development\DebugAssert\DebugAssert\bin\Debug\netcoreapp3.1\DebugAssert.exe (process 38028) exited with code -2146232797.

有没有办法像在 .NET Framework 应用程序中那样在 .NET Core 控制台应用程序中禁用断言? 添加包含上述内容的 App.Config 文件不会影响行为。 (VS2019 将文件复制到输出文件夹,按预期重命名,但应用程序仍然在 Assert 上终止。)

Assert 行为可以通过应用的 runtimeconfig.json 文件中的设置来控制吗?如果是这样,有人知道正确的语法吗? 到目前为止,我已经尝试了一些但没有任何运气。我已经搜索了 assertuienabled 的等价物并画了一个空白。 Debug.Assert 的 Microsoft 文档清楚地表明它在所有 .NET Core 变体中都受支持,但只提到通过 App.Config.

进行控制

您可以从 csproj 文件中的 DefineConstants 属性 中删除 DEBUG 常量,更改此

<DefineConstants>DEBUG;TRACE</DefineConstants>

只是

<DefineConstants>TRACE</DefineConstants>

或取消选中项目属性Build 选项卡上的复选框

另一种选择是删除 DefaultTraceListener from Trace.Listeners 集合

Trace.Listeners.RemoveAt(0);

Debug.Assert(6 == 7, "Bang!");
Console.WriteLine("Hello World!");

它将为您打印 Hello World! 文本。

您还可以添加新的侦听器并在代码中设置 AssertUiEnabledLogFileName 属性(与 .NET Framework 中的 app.config 类似)。

最后一个选项是覆盖 Fail method to customize the Assert behavior, have a look at Customizing Assert behavior 文章以获取详细信息