C# .NET 9 程序如何解决0xc0000602错误

0xc0000602 这个错误几乎让我崩溃,ServBay Windows 版本在某些用户的系统上完全无法运行,双击后必然是闪退,但是在命令行中用 dotnet servbay.dll 又可以正确运行。

同时连带造成的还有另外一个问题,在部分用户的系统上,会提示.NET 9 框架没安装,但事实情况是,.NET 9 框架已经正确安装了。

中途还碰上一个用户刚好是 VMware 的虚拟机出现这个问题,让用户把这个虚拟机打包发过来,在几个不同环境中恢复,都无法复现这个情况。用户换了其他设备也没这个问题,只有在特定的设备、特定的虚拟机上才出现这个问题。同样设备,换另外的虚拟机也没这个问题。

想死。

先看看错误日志:

日志名称:          Application
来源:            Application Error
日期:            2025/7/22 0:18:51
事件 ID:         1000
任务类别:          (100)
级别:            错误
关键字:           经典
用户:            暂缺
计算机:           DESKTOP-DOP0SLL
描述:
错误应用程序名称: ServBay.exe,版本: 1.4.0.2507,时间戳: 0x67890000
错误模块名称: KERNELBASE.dll,版本: 10.0.19041.2913,时间戳: 0xa1c3e870
异常代码: 0xc0000602
错误偏移量: 0x000000000012d862
错误进程 ID: 0x22b0
错误应用程序启动时间: 0x01dbfa5b2525a666
错误应用程序路径: C:\ServBay\app\ServBay.exe
错误模块路径: C:\Windows\System32\KERNELBASE.dll
报告 ID: a6721c90-1bc9-4336-9cd3-14bb87e4cc37
错误程序包全名: 
错误程序包相对应用程序 ID: 
事件 Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Application Error" />
    <EventID Qualifiers="0">1000</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>100</Task>
    <Opcode>0</Opcode>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2025-07-21T16:18:51.4822289Z" />
    <EventRecordID>1593</EventRecordID>
    <Correlation />
    <Execution ProcessID="0" ThreadID="0" />
    <Channel>Application</Channel>
    <Computer>DESKTOP-DOP0SLL</Computer>
    <Security />
  </System>
  <EventData>
    <Data>ServBay.exe</Data>
    <Data>1.4.0.2507</Data>
    <Data>67890000</Data>
    <Data>KERNELBASE.dll</Data>
    <Data>10.0.19041.2913</Data>
    <Data>a1c3e870</Data>
    <Data>c0000602</Data>
    <Data>000000000012d862</Data>
    <Data>22b0</Data>
    <Data>01dbfa5b2525a666</Data>
    <Data>C:\ServBay\app\ServBay.exe</Data>
    <Data>C:\Windows\System32\KERNELBASE.dll</Data>
    <Data>a6721c90-1bc9-4336-9cd3-14bb87e4cc37</Data>
    <Data>
    </Data>
    <Data>
    </Data>
  </EventData>
</Event>

----------------------------------------------------
日志名称:          Application
来源:            Application Error
日期:            2025/7/22 0:46:16
事件 ID:         1000
任务类别:          (100)
级别:            错误
关键字:           经典
用户:            暂缺
计算机:           DESKTOP-DOP0SLL
描述:
错误应用程序名称: ServBay.exe,版本: 1.4.1.2507,时间戳: 0x68500000
错误模块名称: KERNELBASE.dll,版本: 10.0.19041.2913,时间戳: 0xa1c3e870
异常代码: 0xc0000602
错误偏移量: 0x000000000012d862
错误进程 ID: 0x244
错误应用程序启动时间: 0x01dbfa5ef91b70e3
错误应用程序路径: C:\ServBay\app\ServBay.exe
错误模块路径: C:\Windows\System32\KERNELBASE.dll
报告 ID: 994a3e2c-6e37-47f6-9e89-411e36a689d3
错误程序包全名: 
错误程序包相对应用程序 ID: 
事件 Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Application Error" />
    <EventID Qualifiers="0">1000</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>100</Task>
    <Opcode>0</Opcode>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2025-07-21T16:46:16.0397845Z" />
    <EventRecordID>1601</EventRecordID>
    <Correlation />
    <Execution ProcessID="0" ThreadID="0" />
    <Channel>Application</Channel>
    <Computer>DESKTOP-DOP0SLL</Computer>
    <Security />
  </System>
  <EventData>
    <Data>ServBay.exe</Data>
    <Data>1.4.1.2507</Data>
    <Data>68500000</Data>
    <Data>KERNELBASE.dll</Data>
    <Data>10.0.19041.2913</Data>
    <Data>a1c3e870</Data>
    <Data>c0000602</Data>
    <Data>000000000012d862</Data>
    <Data>244</Data>
    <Data>01dbfa5ef91b70e3</Data>
    <Data>C:\ServBay\app\ServBay.exe</Data>
    <Data>C:\Windows\System32\KERNELBASE.dll</Data>
    <Data>994a3e2c-6e37-47f6-9e89-411e36a689d3</Data>
    <Data>
    </Data>
    <Data>
    </Data>
  </EventData>
</Event>

----------------------------------------------------
日志名称:          Application
来源:            .NET Runtime
日期:            2025/7/22 0:36:35
事件 ID:         1023
任务类别:          无
级别:            错误
关键字:           经典
用户:            暂缺
计算机:           DESKTOP-DOP0SLL
描述:
Description: A .NET application failed.
Application: ServBay.exe
Path: C:\ServBay\app\ServBay.exe
Message: A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'C:\Program Files\dotnet\'.
Failed to run as a self-contained app.
  - The application was run as a self-contained app because 'C:\ServBay\app\ServBay.runtimeconfig.json' did not specify a framework.
  - If this should be a framework-dependent app, specify the appropriate framework in 'C:\ServBay\app\ServBay.runtimeconfig.json'.


事件 Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name=".NET Runtime" />
    <EventID Qualifiers="0">1023</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>0</Task>
    <Opcode>0</Opcode>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2025-07-21T16:36:35.3837344Z" />
    <EventRecordID>1598</EventRecordID>
    <Correlation />
    <Execution ProcessID="0" ThreadID="0" />
    <Channel>Application</Channel>
    <Computer>DESKTOP-DOP0SLL</Computer>
    <Security />
  </System>
  <EventData>
    <Data>Description: A .NET application failed.
Application: ServBay.exe
Path: C:\ServBay\app\ServBay.exe
Message: A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'C:\Program Files\dotnet\'.
Failed to run as a self-contained app.
  - The application was run as a self-contained app because 'C:\ServBay\app\ServBay.runtimeconfig.json' did not specify a framework.
  - If this should be a framework-dependent app, specify the appropriate framework in 'C:\ServBay\app\ServBay.runtimeconfig.json'.

</Data>
  </EventData>
</Event>

----------------------------------------------------
日志名称:          Application
来源:            .NET Runtime
日期:            2025/7/22 0:35:10
事件 ID:         1023
任务类别:          无
级别:            错误
关键字:           经典
用户:            暂缺
计算机:           DESKTOP-DOP0SLL
描述:
Description: A .NET application failed.
Application: ServBay.exe
Path: C:\ServBay\app\ServBay.exe
Message: Could not resolve CoreCLR path. For more details, enable tracing by setting COREHOST_TRACE environment variable to 1


事件 Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name=".NET Runtime" />
    <EventID Qualifiers="0">1023</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>0</Task>
    <Opcode>0</Opcode>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2025-07-21T16:35:10.3637351Z" />
    <EventRecordID>1597</EventRecordID>
    <Correlation />
    <Execution ProcessID="0" ThreadID="0" />
    <Channel>Application</Channel>
    <Computer>DESKTOP-DOP0SLL</Computer>
    <Security />
  </System>
  <EventData>
    <Data>Description: A .NET application failed.
Application: ServBay.exe
Path: C:\ServBay\app\ServBay.exe
Message: Could not resolve CoreCLR path. For more details, enable tracing by setting COREHOST_TRACE environment variable to 1

</Data>
  </EventData>
</Event>

最后,终于找到了原因。这个问题,只有在最新的.NET 9+最新的 CPU 系列才会出现。老的设备是不会有这个问题的。

罪魁祸首,是 CET。

根据微软官方说法,在.NET 9 Preview 6开始,CET 会被强制开启。apphost会强制加上一个头部,标记支持 CET。在新的 Intel CPU + 新的 Windows 下,会被执行 CET。但是,如果程序本身是不支持,又或者程序所依赖的 nuget 包不支持 CET 的话,程序就会直接崩溃,没有任何提示,甚至连程序的 main 都进不去,log 也打不出来。

什么叫垃圾,这就是垃圾。

解决方案有两个:

1、让用户打开 Windows 的安全中心-应用和浏览控制-Exploit Protection-程序设置,添加你主程序的名字,比如ServBay.exe,点击自定义,把“硬件强制实施的堆栈保护”中,“替代系统设置”勾上,保持在“关”的状态,保存。再打开程序就可以了。

2、一劳永逸的方法,在程序的.csproj文件中,<PropertyGroup>段,加上<CETCompat>false</CETCompat>,重新编译程序。

所以,如果你的 .NET 9 程序打开闪退,请尝试这个方法。