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

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

    正在检查是否收录...

一、疑难杂症📍

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

二、场景重现

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

发布配置如上,当使用系统自带的事件查看器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:\Windows\SYSTEM32\ntdll.dll LoadedModule[2]=C:\Windows\System32\KERNEL32.DLL LoadedModule[3]=C:\Windows\System32\KERNELBASE.dll LoadedModule[4]=C:\Windows\SYSTEM32\apphelp.dll LoadedModule[5]=C:\InetPub\ftproot\Tipray\Ldterm\ghijt64.DLL LoadedModule[6]=C:\Windows\System32\ADVAPI32.dll LoadedModule[7]=C:\Windows\System32\msvcrt.dll LoadedModule[8]=C:\Windows\System32\sechost.dll LoadedModule[9]=C:\Windows\System32\RPCRT4.dll LoadedModule[10]=C:\Windows\System32\ole32.dll LoadedModule[11]=C:\Windows\System32\ucrtbase.dll LoadedModule[12]=C:\Windows\System32\combase.dll LoadedModule[13]=C:\Windows\System32\GDI32.dll LoadedModule[14]=C:\Windows\System32\win32u.dll LoadedModule[15]=C:\Windows\System32\gdi32full.dll LoadedModule[16]=C:\Windows\System32\msvcp_win.dll LoadedModule[17]=C:\Windows\System32\USER32.dll LoadedModule[18]=C:\Windows\System32\OLEAUT32.dll LoadedModule[19]=C:\Windows\System32\SHELL32.dll LoadedModule[20]=C:\Inetpub\ftproot\Tipray\LdTerm\LdSmartEnc64.dll LoadedModule[21]=C:\Windows\SYSTEM32\FLTLIB.DLL LoadedModule[22]=C:\Windows\System32\IMM32.DLL LoadedModule[23]=C:\Inetpub\ftproot\Tipray\LdTerm\HookCreateProcessInternal64.dll LoadedModule[24]=C:\Inetpub\ftproot\Tipray\LdTerm\LdUserInjectDll64.dll LoadedModule[25]=C:\Inetpub\ftproot\Tipray\LdTerm\HookDataInteractionx64.dll LoadedModule[26]=C:\Inetpub\ftproot\Tipray\LdTerm\LdHook64.dll LoadedModule[27]=C:\Windows\System32\PSAPI.DLL LoadedModule[28]=C:\Windows\SYSTEM32\WINSPOOL.DRV LoadedModule[29]=C:\Windows\SYSTEM32\VERSION.dll LoadedModule[30]=C:\Windows\SYSTEM32\CRYPTBASE.DLL LoadedModule[31]=C:\Inetpub\ftproot\Tipray\LdTerm\ghhlp64.dll LoadedModule[32]=C:\Inetpub\ftproot\Tipray\LdTerm\MonFileOp64.dll LoadedModule[33]=C:\Windows\System32\SHLWAPI.dll LoadedModule[34]=C:\Windows\SYSTEM32\MPR.dll LoadedModule[35]=C:\Inetpub\ftproot\Tipray\LdTerm\LdWaterMarkHook64.dll LoadedModule[36]=C:\Windows\WinSxS\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.19041.1288_none_91a663c8cc864906\gdiplus.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的问题,看来出现这个问题的人还不少,报错的环境也是各种各样的

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

三、问题导致原因🐵

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上面看看,可能会有惊喜哦!

  • 本文作者:WAP站长网
  • 本文链接: https://wapzz.net/post-27864.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
本站部分内容来源于网络转载,仅供学习交流使用。如涉及版权问题,请及时联系我们,我们将第一时间处理。
文章很赞!支持一下吧 还没有人为TA充电
为TA充电
还没有人为TA充电
0
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
2.8W+
9
1
2
WAP站长官方

全新问界M7开售1小时订单破10万 售价28.8万元起

上一篇

「群爆」姿态,爱奇艺暑期档凭什么「剧剧能打」

下一篇
评论区
内容为空

这一切,似未曾拥有

  • 复制图片
按住ctrl可打开默认菜单