You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Forms发布版调用EF的.ThenInclude()崩溃,调试版正常

Windows Forms + Entity Framework 发布版本查询崩溃问题

问题描述

在Windows Forms应用中使用Entity Framework,调试状态下所有查询操作均正常,但调用.ThenInclude()的查询仅在发布版本中崩溃。具体错误为无法加载指定路径下的SNI.dll,引发Microsoft.Data.SqlClient相关类型初始化异常。

崩溃方法代码

public Tprojects DeepLoadProject(int intProjectID)
{
    Tprojects objTiers = new Tprojects();

    try
    {
        RefreshAll();
        objTiers = context.Tprojects
                          .Include(x => x.TprojectItems)
                          .ThenInclude(x => x.IntItem)
                          .Include(x => x.TprojectCustomerCompanies)
                          .ThenInclude(x => x.IntCustomerCompany)
                          .Include(x => x.TprojectCustomerCompanies)
                          .ThenInclude(x => x.TprojectCustomerCompanyContacts)
                          .ThenInclude(x => x.IntContact)
                          .Include(x => x.TprojectItems)
                          .ThenInclude(x => x.TprojectItemCompanyPrices)
                          .ThenInclude(x => x.IntProjectCustomerCompany)
                          .Where(x => x.IntProjectId == intProjectID)
                          .FirstOrDefault();
    }
    catch (Exception ex)
    {
        Show("There was an issue trying to connect to the server, please try again. If this error keeps showing please call an admin for further assistance.");
        SaveErrorLog("DeepLoadProjects " + ex.Message + ex.InnerException, "Hollywood");
    }

    return objTiers;
}

完整异常信息

System.TypeInitializationException: 'Microsoft.Data.SqlClient.TdsParser'的类型初始值设定项引发异常。 ---> System.TypeInitializationException: 'Microsoft.Data.SqlClient.SNILoadHandle'的类型初始值设定项引发异常。 ---> System.TypeInitializationException: 'Microsoft.Data.SqlClient.SNINativeMethodWrapper'的类型初始值设定项引发异常。 ---> System.ComponentModel.Win32Exception: 加载C:\Users\Scott\AppData\Local\Apps\2.0\KD9YXEPJ.DKY\5QCR3OCQ.WRY\vent..tion_098ef6a925fa6387_0001.0009_35951381a6b516d2\x86\SNI.dll失败 ---> System.ComponentModel.Win32Exception: 找不到指定的模块
   --- 内部异常堆栈跟踪结束 ---
   在 Microsoft.Data.SqlClient.SNINativeMethodWrapper..cctor()
   --- 内部异常堆栈跟踪结束 ---
   在 Microsoft.Data.SqlClient.SNINativeMethodWrapper.SNIInitialize()
   在 Microsoft.Data.SqlClient.SNILoadHandle..ctor()
   在 Microsoft.Data.SqlClient.SNILoadHandle..cctor()
   --- 内部异常堆栈跟踪结束 ---
   在 Microsoft.Data.SqlClient.TdsParser..cctor()
   --- 内部异常堆栈跟踪结束 ---
   在 Microsoft.Data.SqlClient.TdsParser..ctor(Boolean MARS, Boolean fAsynchronous)
   ...[完整栈信息见原文]

加载的程序集信息

[完整程序集列表见原文]

解决方案建议

  • 检查发布时的SNI.dll包含情况:确认已正确安装Microsoft.Data.SqlClient NuGet包,发布过程中是否将对应架构(x86/x64)的SNI.dll复制到输出目录。可在项目中设置将Native DLL复制到输出,或通过NuGet包确保依赖项自动包含。
  • 统一调试与发布的平台目标:确保调试和发布模式下的项目平台目标一致(如均为x86或x64),避免因架构不匹配导致找不到对应版本的SNI.dll。
  • 检查ClickOnce发布设置:若使用ClickOnce发布,进入项目属性的发布选项,在“应用程序文件”中确认SNI.dll相关文件已被包含,并设置为“包含(自动)”。
  • 更新Microsoft.Data.SqlClient版本:升级到最新稳定版,修复已知的Native组件加载问题。
  • 手动复制SNI.dll到发布目录:从NuGet包路径(通常为packages/Microsoft.Data.SqlClient.x.x.x/runtimes/win-x86/native或win-x64/native)找到对应架构的SNI.dll,手动复制到发布后的对应文件夹(如x86目录)。
  • 确认系统依赖组件:SNI.dll依赖Visual C运行库,确保目标机器已安装对应的Visual C Redistributable包。

内容的提问来源于stack exchange,提问作者Scott Uphus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:25:24