Windows 11 24H2更新后Delphi调用C# COM组件EF查询报错求助
Windows 11 24H2后Delphi调用C# COM库时EF数值过滤触发$C0000090浮点异常的解决办法
核心原因推测
Windows 11 24H2更新调整了系统默认的浮点运算控制字,或是修改了跨语言/跨进程的浮点上下文传递规则,导致Delphi调用C# COM组件时,Entity Framework执行LINQ数值比较操作触发浮点无效异常。
解决方案
1. 对齐数据库与实体类的数值类型
浮点类型不匹配是此类异常的常见诱因,先确认数据库列和C#实体属性的类型完全一致:
- 如果数据库中
LoanAmt为decimal/numeric类型,C#实体中不要用float/double,改用decimal类型:
同时LINQ查询使用decimal字面量做比较:// 实体类调整示例 public class ARLoan { public decimal LoanAmt { get; set; } // 与数据库类型严格匹配 // 其他属性... }var LoanList = db.ARLoans.Where(x => x.LoanAmt == 0m).ToList();
2. 避免直接使用浮点相等判断
如果必须使用float/double类型,不要直接用==做相等判断,而是设置精度阈值:
// 针对float类型的安全比较方式 var LoanList = db.ARLoans.Where(x => Math.Abs(x.LoanAmt) < 1e-6).ToList();
3. 在C# COM方法中重置浮点运算上下文
Windows 11 24H2可能改变了默认浮点控制字,在COM方法开头重置为标准状态:
using System.Runtime.InteropServices; namespace SampleApp { [Guid("ACCBC742-CAE9-4958-97E9-AA9CDA61DDF7"), ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)] public class ARLoanManager { [DllImport("kernel32.dll")] static extern uint _controlfp(uint newControl, uint mask); public void ARUpdateLoan(string LoanNo) { // 重置浮点控制字为系统默认值 _controlfp(0x0009001F, 0xFFFFFFFF); CSCommon.MyConnString = @"Password=mahavira;Persist Security Info=True;User ID=sa;Initial Catalog=SaccoMan;Data Source=.\sqlexpress;connection timeout=60;"; using (var db = new DataContext()) { var LoanList = db.ARLoans.Where(x => x.LoanAmt == 0).ToList(); } } } }
4. 以兼容模式运行Delphi程序
右键Delphi生成的exe文件 → 属性 → 兼容性 → 勾选「以兼容模式运行这个程序」,选择Windows 10或更早版本,应用后重新测试调用。
5. 更新依赖版本
- 确认.NET Framework版本与Windows 11 24H2兼容,建议升级到.NET Framework 4.8.1及以上;
- 将Entity Framework 6.5.1升级到最新稳定版,检查官方是否有针对Windows 11的修复补丁。
调试建议
在C# COM方法中添加日志输出,确认异常是在EF查询执行时抛出,还是在结果返回给Delphi的过程中触发,进一步缩小问题范围。
内容的提问来源于stack exchange,提问作者KE50
相关产品推荐
相关产品推荐

