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

使用RunImpersonated无法加载依赖 调用SqlConnection.Open报dll缺失怎么解决

解决方案

模拟状态下加载模块的实现方式

Windows身份模拟上下文下无法加载模块的核心原因是:模拟身份默认不具备进程私有目录的读取权限,或是DLL搜索路径在模拟上下文下被限制,可通过以下方式解决:

  • 调用Win32 API LoadLibraryEx 时传入LOAD_LIBRARY_SEARCH_DEFAULT_DIRS参数,可跳过用户上下文的路径限制,直接在模拟上下文内完成DLL加载,无需提前在模拟外执行加载逻辑。
  • .NET Core/.NET 5+ 环境下可在项目文件中添加配置 <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>,强制所有NuGet依赖都输出到程序运行目录,模拟身份只要有运行目录的读取权限,即可正常加载模块。

sni.dll 缺失报错修复方案

System.Data.SqlClient 调用SqlConnection.Open()时触发sni.dll加载失败,可按以下优先级排查修复:

  • 确认项目平台目标与sni.dll架构匹配:很多报错是因为项目设置为Any CPU,运行时还原的sni.dll架构与当前系统不匹配,将项目平台目标固定为x64或x86,重新还原NuGet包后重新编译即可。
  • 显式预加载sni.dll:如果已经采用模拟前预加载模块的方案,不要仅加载System.Data.SqlClient.dll,可通过Win32 API LoadLibrary 显式预加载sni.dll到进程空间,避免模拟上下文下触发加载逻辑:
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr LoadLibrary(string lpFileName);

// 模拟启动前执行
LoadLibrary("sni.dll");
  • 系统目录兜底放置:生产环境紧急修复时,可将对应架构的sni.dll手动拷贝到系统目录(64位路径为C:\Windows\System32,32位路径为C:\Windows\SysWOW64),系统目录在模拟上下文下默认允许搜索读取,可快速解决问题。
  • 依赖包替换:可将System.Data.SqlClient替换为Microsoft.Data.SqlClient NuGet包,该包优化了sni.dll加载逻辑,会优先加载包内自带的对应架构的sni.dll,大幅降低模拟上下文下的加载报错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:57:02