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

已找到正确版本仍无法加载Microsoft.SqlServer.Smo程序集的求助

疑难排查:Microsoft.SqlServer.Smo v15.0.0.0 加载失败(Fusion日志无法启用)

这真是个让人头大的程序集加载问题——乍一看是常见的版本不匹配,但实际排查下来处处反常,连Fusion日志都不给面子,完全没法按常规思路来。先理清楚目前的核心情况:

完整错误信息

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.SqlServer.Smo, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Microsoft.SqlServer.Smo, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'
   at DatabaseManagement.clsDatabaseManagement.DeployDatabase(clsDatabaseDeploymentElement deployment, String scriptPath, String dataFilePath, String logFilePath)
   at DatabaseManagement.clsDatabaseManagement.DeployDatabase(clsDatabaseDeploymentElement deployment) in C:\agent\_work\4\s\src\Database\DatabaseManagement\DatabaseManagement.cs:line 920
   at DBAdmin.clsProgram.ProcessAction(Action action, clsDatabaseManagement manager) in C:\agent\_work\4\s\src\Database\DBAdmin\Program.cs:line 664

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

Processing aborted!

关键矛盾点

系统明确提示“找到的程序集清单和引用不匹配”,但你已经确认:

  • 找到的程序集就是Microsoft.SqlServer.Smo, Version=15.0.0.0,版本、公钥完全一致
  • 绑定重定向配置已经指向v15,且配置是生效的(修改newVersion为16时错误信息同步变化)
  • 本地目录和GAC都有正确版本的DLL,依赖项也齐全

已尝试的验证操作

  • 可执行文件目录存在v15版本的DLL,且所有依赖项都在同一目录(通过ilasm/ilspy验证)
  • 目标机器已安装对应.NET版本(v15基于.NET 4.5)
  • 正确版本已注册到GAC,但问题依旧
  • 放入v16 DLL后错误仍显示找v15,说明程序没读取本地目录的程序集

针对性排查&解决方案

1. 深挖依赖项的隐藏版本冲突

Smo的依赖链很长(比如Microsoft.SqlServer.ConnectionInfo、Microsoft.SqlServer.Management.Sdk.Sfc等),这些依赖项的版本可能和Smo v15不匹配——错误信息只会报Smo的问题,但根源可能在某个依赖项上。

  • 用ildasm打开Smo.dll,查看清单里依赖的所有程序集版本,逐一核对本地/GAC里的对应文件版本是否完全一致
  • 给所有Smo相关的依赖项都添加绑定重定向,覆盖可能的版本差异:
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <!-- 现有Smo的绑定重定向 -->
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.ConnectionInfo" publicKeyToken="89845dcd8080cc91" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-15.0.0.0" newVersion="15.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Management.Sdk.Sfc" publicKeyToken="89845dcd8080cc91" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-15.0.0.0" newVersion="15.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

2. 强制程序优先加载本地目录的程序集

你提到放入v16 DLL后错误仍显示找v15,说明程序可能优先从GAC加载,甚至跳过了本地目录。可以:

  • 在配置文件里添加<probing>节点,明确指定优先查找当前目录:
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <!-- 现有绑定重定向 -->
    <probing privatePath="." />
  </assemblyBinding>
</runtime>
  • 或者在代码里添加程序集解析事件,强制从本地目录加载:
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
    var assemblyName = new AssemblyName(args.Name);
    var localPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{assemblyName.Name}.dll");
    if (File.Exists(localPath)) {
        return Assembly.LoadFrom(localPath);
    }
    return null;
};

3. 搞定Fusion日志(关键!)

没有Fusion日志就像瞎子摸象,必须解决这个问题:

  • 确保以管理员身份修改注册表,并且注意架构:64位程序要修改HKLM\Software\Wow6432Node\Microsoft\Fusion!EnableLog,32位程序则用HKLM\Software\Microsoft\Fusion下的节点
  • 用fuslogvw.exe(Fusion Log Viewer)来配置:打开后点击「Settings」,选择「Log bind failures to disk」,确定后再运行程序,日志会自动生成
  • 如果是服务程序,要重启服务而不是只重启机器

4. 验证程序集的完整性和强签名

有可能文件被篡改或者强签名不匹配:

  • 用sn.exe -v Microsoft.SqlServer.Smo.dll验证强签名是否有效
  • 对比本地DLL和GAC中DLL的哈希值:
    • GAC路径示例:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\v4.0_15.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll
    • PowerShell计算哈希:Get-FileHash -Path "你的DLL路径" -Algorithm SHA256,确认两个文件哈希一致

5. 安装SQL Server共享组件

Smo依赖SQL Server的核心共享功能,可能目标机器只拷贝了DLL但缺少底层组件。尝试安装SSMS v18.x(对应Smo v15),它会自动安装所有必要的依赖并注册程序集。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:40:39