关于.net9发布单体exe程序无法打开问题详解

一、疑难杂症📍

​ 某天,开开心心的使用了最新的.net9开发了一个winform程序,在发布成x64架构的单文件exe后,在电脑上面竟然打不开,经过多次尝试后发现x86版本的在本地电脑上测试没有问题,但是一发布成x64模式则会进行报错

二、场景重现

发布配置如上,当使用系统自带的事件查看器drump错误,抓到数据如下

Version=1
EventType=APPCRASH
EventTime=134012782822231598
ReportType=2
Consent=1
UploadTime=134012783158499355
ReportStatus=268439648
ReportIdentifier=34beb59a-eca4-4639-82ac-a6a356f6c0ee
IntegratorReportIdentifier=7be766a2-0334-435e-8f1f-9de061e719c4
Wow64Host=34404
NsAppName=工具.exe
OriginalFilename=工具.dll
AppSessionGuid=00003770-0001-0205-fae8-4e7bea1bdc01
TargetAppId=W:0006860c34e8850dfd245f76021df6a94dbd00000000!0000084e67ec0f97c6d906b825c90602a2ce4666eb41!工具.exe
TargetAppVer=2025//06//16:18:48:31!0!工具.exe
BootId=4294967295
TargetAsId=2372
IsFatal=1
EtwNonCollectReason=4
Response.BucketId=6bd1075ac6d404d421418afefa96e95b
Response.BucketTable=4
Response.LegacyBucketId=1243427799861487963
Response.type=4
Sig[0].Name=应用程序名
Sig[0].Value=工具.exe
Sig[1].Name=应用程序版本
Sig[1].Value=1.0.0.0
Sig[2].Name=应用程序时间戳
Sig[2].Value=685066ff
Sig[3].Name=故障模块名称
Sig[3].Value=KERNELBASE.dll
Sig[4].Name=故障模块版本
Sig[4].Value=10.0.19041.1202
Sig[5].Name=故障模块时间戳
Sig[5].Value=c9db1934
Sig[6].Name=异常代码
Sig[6].Value=c0000602
Sig[7].Name=异常偏移
Sig[7].Value=000000000010be3e
DynamicSig[1].Name=OS 版本
DynamicSig[1].Value=10.0.19044.2.0.0.256.191
DynamicSig[2].Name=区域设置 ID
DynamicSig[2].Value=2052
DynamicSig[22].Name=其他信息 1
DynamicSig[22].Value=162d
DynamicSig[23].Name=其他信息 2
DynamicSig[23].Value=162dc7323adee510a77f5cd94c6dfe5f
DynamicSig[24].Name=其他信息 3
DynamicSig[24].Value=cdd1
DynamicSig[25].Name=其他信息 4
DynamicSig[25].Value=cdd1120f7c4950a490c053074b983c78
UI[2]=C:win-x64工具.exe
LoadedModule[0]=C:win-x64工具.exe
LoadedModule[1]=C:WindowsSYSTEM32ntdll.dll
LoadedModule[2]=C:WindowsSystem32KERNEL32.DLL
LoadedModule[3]=C:WindowsSystem32KERNELBASE.dll
LoadedModule[4]=C:WindowsSYSTEM32apphelp.dll
LoadedModule[5]=C:InetPubftprootTiprayLdtermghijt64.DLL
LoadedModule[6]=C:WindowsSystem32ADVAPI32.dll
LoadedModule[7]=C:WindowsSystem32msvcrt.dll
LoadedModule[8]=C:WindowsSystem32sechost.dll
LoadedModule[9]=C:WindowsSystem32RPCRT4.dll
LoadedModule[10]=C:WindowsSystem32ole32.dll
LoadedModule[11]=C:WindowsSystem32ucrtbase.dll
LoadedModule[12]=C:WindowsSystem32combase.dll
LoadedModule[13]=C:WindowsSystem32GDI32.dll
LoadedModule[14]=C:WindowsSystem32win32u.dll
LoadedModule[15]=C:WindowsSystem32gdi32full.dll
LoadedModule[16]=C:WindowsSystem32msvcp_win.dll
LoadedModule[17]=C:WindowsSystem32USER32.dll
LoadedModule[18]=C:WindowsSystem32OLEAUT32.dll
LoadedModule[19]=C:WindowsSystem32SHELL32.dll
LoadedModule[20]=C:InetpubftprootTiprayLdTermLdSmartEnc64.dll
LoadedModule[21]=C:WindowsSYSTEM32FLTLIB.DLL
LoadedModule[22]=C:WindowsSystem32IMM32.DLL
LoadedModule[23]=C:InetpubftprootTiprayLdTermHookCreateProcessInternal64.dll
LoadedModule[24]=C:InetpubftprootTiprayLdTermLdUserInjectDll64.dll
LoadedModule[25]=C:InetpubftprootTiprayLdTermHookDataInteractionx64.dll
LoadedModule[26]=C:InetpubftprootTiprayLdTermLdHook64.dll
LoadedModule[27]=C:WindowsSystem32PSAPI.DLL
LoadedModule[28]=C:WindowsSYSTEM32WINSPOOL.DRV
LoadedModule[29]=C:WindowsSYSTEM32VERSION.dll
LoadedModule[30]=C:WindowsSYSTEM32CRYPTBASE.DLL
LoadedModule[31]=C:InetpubftprootTiprayLdTermghhlp64.dll
LoadedModule[32]=C:InetpubftprootTiprayLdTermMonFileOp64.dll
LoadedModule[33]=C:WindowsSystem32SHLWAPI.dll
LoadedModule[34]=C:WindowsSYSTEM32MPR.dll
LoadedModule[35]=C:InetpubftprootTiprayLdTermLdWaterMarkHook64.dll
LoadedModule[36]=C:WindowsWinSxSamd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.19041.1288_none_91a663c8cc864906gdiplus.dll
State[0].Key=Transport.DoneStage1
State[0].Value=1
OsInfo[0].Key=vermaj
OsInfo[0].Value=10
OsInfo[1].Key=vermin
OsInfo[1].Value=0
OsInfo[2].Key=verbld
OsInfo[2].Value=19044
OsInfo[3].Key=ubr
OsInfo[3].Value=1288
OsInfo[4].Key=versp
OsInfo[4].Value=0
OsInfo[5].Key=arch
OsInfo[5].Value=9
OsInfo[6].Key=lcid
OsInfo[6].Value=2052
OsInfo[7].Key=geoid
OsInfo[7].Value=45
OsInfo[8].Key=sku
OsInfo[8].Value=191
OsInfo[9].Key=domain
OsInfo[9].Value=1
OsInfo[10].Key=prodsuite
OsInfo[10].Value=256
OsInfo[11].Key=ntprodtype
OsInfo[11].Value=1
OsInfo[12].Key=platid
OsInfo[12].Value=10
OsInfo[13].Key=sr
OsInfo[13].Value=0
OsInfo[14].Key=tmsi
OsInfo[14].Value=1099223
OsInfo[15].Key=osinsty
OsInfo[15].Value=1
OsInfo[16].Key=iever
OsInfo[16].Value=11.789.19041.0-11.0.1000
OsInfo[17].Key=portos
OsInfo[17].Value=0
OsInfo[18].Key=ram
OsInfo[18].Value=7880
OsInfo[19].Key=svolsz
OsInfo[19].Value=238
OsInfo[20].Key=wimbt
OsInfo[20].Value=0
OsInfo[21].Key=blddt
OsInfo[21].Value=191206
OsInfo[22].Key=bldtm
OsInfo[22].Value=1406
OsInfo[23].Key=bldbrch
OsInfo[23].Value=vb_release
OsInfo[24].Key=bldchk
OsInfo[24].Value=0
OsInfo[25].Key=wpvermaj
OsInfo[25].Value=0
OsInfo[26].Key=wpvermin
OsInfo[26].Value=0
OsInfo[27].Key=wpbuildmaj
OsInfo[27].Value=0
OsInfo[28].Key=wpbuildmin
OsInfo[28].Value=0
OsInfo[29].Key=osver
OsInfo[29].Value=10.0.19041.1288.amd64fre.vb_release.191206-1406
OsInfo[30].Key=buildflightid
OsInfo[31].Key=edition
OsInfo[31].Value=IoTEnterpriseS
OsInfo[32].Key=ring
OsInfo[32].Value=Retail
OsInfo[33].Key=expid
OsInfo[34].Key=fconid
OsInfo[35].Key=containerid
OsInfo[36].Key=containertype
OsInfo[37].Key=edu
OsInfo[37].Value=0
FriendlyEventName=已停止工作
ConsentKey=APPCRASH
AppName=工具
AppPath=C:win-x64工具.exe
NsPartner=windows 
NsGroup=windows8
ApplicationIdentity=8CE23494FD3E8EC4878D62E3C55F8B8E
MetadataHash=784019804

准备去微软的开源库查查是否有这方面issue,一查发现罪魁祸首竟然是.net9sdk的问题,看来出现这个问题的人还不少,报错的环境也是各种各样的

三、问题导致原因🐵

1.在特定的VMware 的虚拟机运行时会导致此种情况

2.在特定的win10以及之前版本上会出现

3.在系统电脑安装了防病毒软件(绿盾、360,等)

在看了多个issue之后,找到了罪魁祸首,程序启动及崩溃只有在使用最新的.NET9的sdk上在发布x64版本时会出现这种情况,微软在.NET 9 Preview 6开始,CET 会被强制开启。apphost会强制加上一个头部,标记支持 CET。在新的 Intel CPU + 新的 Windows 下,会被执行 CET。但是,如果程序本身是不支持,又或者程序所依赖的 nuget 包不支持 CET 的话,程序就会直接崩溃,没有任何提示,甚至连程序的 main 都进不去,log 也打不出来。

所以说,我之前添加的全局错误日志为什么没有抓到这个异常,原来在运行时就已经崩溃了

四、如何解决🌵

1.不要使用x64进行发布,测试使用x86发布后可以正常打开

2.在受影响机器上面不要通过双击生成的.exe应用程序,通过 PowerShell 或 CMD 可正常运行

3.在受影响机器上面打开windows安全种-应用和浏览控制-Exploit Protection-程序设置,添加主程序的名字,例如“工具.exe”,点击自定义,把“硬件强制实施的堆栈保护”中,“替代系统设置”勾上,保持在“关”的状态,保存。再打开程序就可以了。

4.最后一个就是关闭.net9的cet功能,在程序的.csproj文件中,<PropertyGroup>段,加上<CETCompat>false</CETCompat>,重新编译程序,再发布后即可正常运行。

问题到这就解决了,当从.net8升级到.ne9后,没想到还会遇到这种疑难杂症,看来在每一个大版本更新之后,还是要慎重,当然自身的调试debug能力也得有,出现问题的时候能够定位到问题点,没有解决思路的时候不如去官方的issue上面看看,可能会有惊喜哦!

版权声明:cnblogshot 发表于 2025-09-05 18:42:16。
转载请注明:关于.net9发布单体exe程序无法打开问题详解 | 程序员导航网

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...