关于.net9发布单体exe程序无法打开问题详解
<p>一、疑难杂症📍</p><p> 某天,开开心心的使用了最新的.net9开发了一个winform程序,在发布成x64架构的单文件exe后,在电脑上面竟然打不开,经过多次尝试后发现x86版本的在本地电脑上测试没有问题,但是一发布成x64模式则会进行报错</p>
<p>二、场景重现</p>
<p><img src="https://img2024.cnblogs.com/blog/2664797/202509/2664797-20250905135737188-700679481.png" alt="image-20250905112936301" loading="lazy"></p>
<p>发布配置如上,当使用系统自带的事件查看器drump错误,抓到数据如下</p>
<pre><code>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.Name=应用程序名
Sig.Value=工具.exe
Sig.Name=应用程序版本
Sig.Value=1.0.0.0
Sig.Name=应用程序时间戳
Sig.Value=685066ff
Sig.Name=故障模块名称
Sig.Value=KERNELBASE.dll
Sig.Name=故障模块版本
Sig.Value=10.0.19041.1202
Sig.Name=故障模块时间戳
Sig.Value=c9db1934
Sig.Name=异常代码
Sig.Value=c0000602
Sig.Name=异常偏移
Sig.Value=000000000010be3e
DynamicSig.Name=OS 版本
DynamicSig.Value=10.0.19044.2.0.0.256.191
DynamicSig.Name=区域设置 ID
DynamicSig.Value=2052
DynamicSig.Name=其他信息 1
DynamicSig.Value=162d
DynamicSig.Name=其他信息 2
DynamicSig.Value=162dc7323adee510a77f5cd94c6dfe5f
DynamicSig.Name=其他信息 3
DynamicSig.Value=cdd1
DynamicSig.Name=其他信息 4
DynamicSig.Value=cdd1120f7c4950a490c053074b983c78
UI=C:\win-x64\工具.exe
LoadedModule=C:\win-x64\工具.exe
LoadedModule=C:\Windows\SYSTEM32\ntdll.dll
LoadedModule=C:\Windows\System32\KERNEL32.DLL
LoadedModule=C:\Windows\System32\KERNELBASE.dll
LoadedModule=C:\Windows\SYSTEM32\apphelp.dll
LoadedModule=C:\InetPub\ftproot\Tipray\Ldterm\ghijt64.DLL
LoadedModule=C:\Windows\System32\ADVAPI32.dll
LoadedModule=C:\Windows\System32\msvcrt.dll
LoadedModule=C:\Windows\System32\sechost.dll
LoadedModule=C:\Windows\System32\RPCRT4.dll
LoadedModule=C:\Windows\System32\ole32.dll
LoadedModule=C:\Windows\System32\ucrtbase.dll
LoadedModule=C:\Windows\System32\combase.dll
LoadedModule=C:\Windows\System32\GDI32.dll
LoadedModule=C:\Windows\System32\win32u.dll
LoadedModule=C:\Windows\System32\gdi32full.dll
LoadedModule=C:\Windows\System32\msvcp_win.dll
LoadedModule=C:\Windows\System32\USER32.dll
LoadedModule=C:\Windows\System32\OLEAUT32.dll
LoadedModule=C:\Windows\System32\SHELL32.dll
LoadedModule=C:\Inetpub\ftproot\Tipray\LdTerm\LdSmartEnc64.dll
LoadedModule=C:\Windows\SYSTEM32\FLTLIB.DLL
LoadedModule=C:\Windows\System32\IMM32.DLL
LoadedModule=C:\Inetpub\ftproot\Tipray\LdTerm\HookCreateProcessInternal64.dll
LoadedModule=C:\Inetpub\ftproot\Tipray\LdTerm\LdUserInjectDll64.dll
LoadedModule=C:\Inetpub\ftproot\Tipray\LdTerm\HookDataInteractionx64.dll
LoadedModule=C:\Inetpub\ftproot\Tipray\LdTerm\LdHook64.dll
LoadedModule=C:\Windows\System32\PSAPI.DLL
LoadedModule=C:\Windows\SYSTEM32\WINSPOOL.DRV
LoadedModule=C:\Windows\SYSTEM32\VERSION.dll
LoadedModule=C:\Windows\SYSTEM32\CRYPTBASE.DLL
LoadedModule=C:\Inetpub\ftproot\Tipray\LdTerm\ghhlp64.dll
LoadedModule=C:\Inetpub\ftproot\Tipray\LdTerm\MonFileOp64.dll
LoadedModule=C:\Windows\System32\SHLWAPI.dll
LoadedModule=C:\Windows\SYSTEM32\MPR.dll
LoadedModule=C:\Inetpub\ftproot\Tipray\LdTerm\LdWaterMarkHook64.dll
LoadedModule=C:\Windows\WinSxS\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.19041.1288_none_91a663c8cc864906\gdiplus.dll
State.Key=Transport.DoneStage1
State.Value=1
OsInfo.Key=vermaj
OsInfo.Value=10
OsInfo.Key=vermin
OsInfo.Value=0
OsInfo.Key=verbld
OsInfo.Value=19044
OsInfo.Key=ubr
OsInfo.Value=1288
OsInfo.Key=versp
OsInfo.Value=0
OsInfo.Key=arch
OsInfo.Value=9
OsInfo.Key=lcid
OsInfo.Value=2052
OsInfo.Key=geoid
OsInfo.Value=45
OsInfo.Key=sku
OsInfo.Value=191
OsInfo.Key=domain
OsInfo.Value=1
OsInfo.Key=prodsuite
OsInfo.Value=256
OsInfo.Key=ntprodtype
OsInfo.Value=1
OsInfo.Key=platid
OsInfo.Value=10
OsInfo.Key=sr
OsInfo.Value=0
OsInfo.Key=tmsi
OsInfo.Value=1099223
OsInfo.Key=osinsty
OsInfo.Value=1
OsInfo.Key=iever
OsInfo.Value=11.789.19041.0-11.0.1000
OsInfo.Key=portos
OsInfo.Value=0
OsInfo.Key=ram
OsInfo.Value=7880
OsInfo.Key=svolsz
OsInfo.Value=238
OsInfo.Key=wimbt
OsInfo.Value=0
OsInfo.Key=blddt
OsInfo.Value=191206
OsInfo.Key=bldtm
OsInfo.Value=1406
OsInfo.Key=bldbrch
OsInfo.Value=vb_release
OsInfo.Key=bldchk
OsInfo.Value=0
OsInfo.Key=wpvermaj
OsInfo.Value=0
OsInfo.Key=wpvermin
OsInfo.Value=0
OsInfo.Key=wpbuildmaj
OsInfo.Value=0
OsInfo.Key=wpbuildmin
OsInfo.Value=0
OsInfo.Key=osver
OsInfo.Value=10.0.19041.1288.amd64fre.vb_release.191206-1406
OsInfo.Key=buildflightid
OsInfo.Key=edition
OsInfo.Value=IoTEnterpriseS
OsInfo.Key=ring
OsInfo.Value=Retail
OsInfo.Key=expid
OsInfo.Key=fconid
OsInfo.Key=containerid
OsInfo.Key=containertype
OsInfo.Key=edu
OsInfo.Value=0
FriendlyEventName=已停止工作
ConsentKey=APPCRASH
AppName=工具
AppPath=C:\win-x64\工具.exe
NsPartner=windows
NsGroup=windows8
ApplicationIdentity=8CE23494FD3E8EC4878D62E3C55F8B8E
MetadataHash=784019804
</code></pre>
<p>准备去微软的开源库查查是否有这方面issue,一查发现罪魁祸首竟然是.net9sdk的问题,看来出现这个问题的人还不少,报错的环境也是各种各样的</p>
<p><img src="https://img2024.cnblogs.com/blog/2664797/202509/2664797-20250905135618952-321175828.png" alt="image-20250905113715195" loading="lazy"></p>
<p>三、问题导致原因🐵</p>
<p>1.在特定的VMware 的虚拟机运行时会导致此种情况</p>
<p>2.在特定的win10以及之前版本上会出现</p>
<p>3.在系统电脑安装了防病毒软件(绿盾、360,等)</p>
<p>在看了多个issue之后,找到了罪魁祸首,程序启动及崩溃只有在使用最新的.NET9的sdk上在发布x64版本时会出现这种情况,微软在.NET 9 Preview 6开始,CET 会被强制开启。apphost会强制加上一个头部,标记支持 CET。在新的 Intel CPU + 新的 Windows 下,会被执行 CET。但是,如果程序本身是不支持,又或者程序所依赖的 nuget 包不支持 CET 的话,程序就会直接崩溃,没有任何提示,甚至连程序的 main 都进不去,log 也打不出来。</p>
<p>所以说,我之前添加的全局错误日志为什么没有抓到这个异常,原来在运行时就已经崩溃了</p>
<p>四、如何解决🌵</p>
<p>1.不要使用x64进行发布,测试使用x86发布后可以正常打开</p>
<p>2.在受影响机器上面不要通过双击生成的.exe应用程序,通过 PowerShell 或 CMD 可正常运行</p>
<p>3.在受影响机器上面打开windows安全种-应用和浏览控制-Exploit Protection-程序设置,添加主程序的名字,例如“工具.exe”,点击自定义,把“硬件强制实施的堆栈保护”中,“替代系统设置”勾上,保持在“关”的状态,保存。再打开程序就可以了。</p>
<p>4.最后一个就是关闭.net9的cet功能,在程序的<code>.csproj</code>文件中,<code><PropertyGroup></code>段,加上<code><CETCompat>false</CETCompat></code>,重新编译程序,再发布后即可正常运行。</p>
<p>问题到这就解决了,当从.net8升级到.ne9后,没想到还会遇到这种疑难杂症,看来在每一个大版本更新之后,还是要慎重,当然自身的调试debug能力也得有,出现问题的时候能够定位到问题点,没有解决思路的时候不如去官方的issue上面看看,可能会有惊喜哦!</p><br><br>
来源:https://www.cnblogs.com/sc-Free-Die/p/19075260
頁:
[1]