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!
文本。
您还可以添加新的侦听器并在代码中设置 AssertUiEnabled
或 LogFileName
属性(与 .NET Framework 中的 app.config
类似)。
最后一个选项是覆盖 Fail
method to customize the Assert
behavior, have a look at Customizing Assert behavior 文章以获取详细信息
考虑以下简单程序:
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!
文本。
您还可以添加新的侦听器并在代码中设置 AssertUiEnabled
或 LogFileName
属性(与 .NET Framework 中的 app.config
类似)。
最后一个选项是覆盖 Fail
method to customize the Assert
behavior, have a look at Customizing Assert behavior 文章以获取详细信息