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
相关产品推荐
相关产品推荐

