解决在升级 dotnet 9 之后 某些 P/Invoke 代码异常的问题
最近在使用第三方的某sdk的时候,发现示例程序一切正常,但是同样的代码在 .net9 上就直接闪退
1 | [] |
在 x64dbg 里面显示的是 STATUS_STACK_BUFFER_OVERRUN ,不过我看不懂汇编,也没法分析和正常的调用有什么差异
1 | INT3 断点 "DllMain (softlic64.dll)" 于 <softlic64.OptionalHeader.AddressOfEntryPoint> (00007FFBC51474F0) ! |
起初以为是 dll 只支持 framework, 但是在改为 net8.0 之后代码又能正常运行了。
但是去 dotnet 官网看了一圈也没有发现什么端倪,于是就想去 issue 里搜关键词 STATUS_STACK_BUFFER_OVERRUN 碰碰运气
结果还真发现了解决方法 NET 9.0 RC2 NativeLibrary.Load crashes #107993
原来 .net9 的 Interop 默认启用了 CET 支持: https://learn.microsoft.com/zh-cn/dotnet/core/compatibility/interop/9.0/cet-support
解决方法是在项目文件里面禁用 CET 即可。
1 | <CETCompat>false</CETCompat> |
解决在升级 dotnet 9 之后 某些 P/Invoke 代码异常的问题