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

SSIS脚本任务从MongoDB导数据至SQL Server报错:无法加载MongoDB.Driver.Core

解决SSIS脚本任务引用MongoDB 2.3驱动的编译错误

我之前也踩过SSIS脚本任务结合MongoDB驱动的强命名、GAC引用的坑,咱们来一步步搞定这个IAsyncCursorSource<>的引用错误:

问题根源分析

你遇到的错误本质是手动强命名破坏了MongoDB驱动组件之间的依赖绑定。MongoDB 2.3版本的原生MongoDB.Driver.dll和MongoDB.Driver.Core.dll是没有强名称的,你给它们分别添加强命名后,两个组件的公钥令牌不匹配,导致MongoDB.Driver无法找到它依赖的、带有正确签名的MongoDB.Driver.Core版本,编译器就会抛出这个找不到程序集的错误。

分步解决方案

1. 统一强命名所有MongoDB驱动组件

如果一定要用GAC部署,必须确保三个核心dll(MongoDB.Driver.dll、MongoDB.Driver.Core.dll、MongoDB.Bson.dll)使用同一个强命名密钥对签名,步骤如下:

  • 用sn.exe生成一个密钥对文件(比如MongoKey.snk):
    sn -k MongoKey.snk
    
  • 对每个dll依次执行以下操作:
    1. 用ildasm导出IL代码:
      ildasm /out:MongoDB.Driver.il MongoDB.Driver.dll
      
    2. 用文本编辑器打开生成的.il文件,找到.assembly MongoDB.Driver部分,添加公钥信息(先通过sn -p MongoKey.snk MongoPubKey.pub导出公钥,再把公钥字符串粘贴进去):
      .assembly MongoDB.Driver
      {
        .publickeytoken = (你的公钥令牌)
        .ver 2:3:0:157
      }
      
    3. 用ilasm重新编译并签名:
      ilasm /dll /key:MongoKey.snk MongoDB.Driver.il
      
  • 对另外两个dll重复上述步骤,确保都用同一个MongoKey.snk签名,然后再把它们添加到GAC。

2. 跳过GAC,直接本地引用(更简单的方案)

SSIS脚本任务对GAC中手动签名的dll经常会有识别问题,更稳妥的方式是直接本地部署:

  • 把三个处理好的dll(或者甚至不用强命名的原生dll,只要SSIS能加载)复制到你的SSIS包所在的目录,或者Visual Studio项目的\bin\Debug文件夹下;
  • 打开脚本任务的编辑界面,右键点击项目->添加引用->浏览,选择本地的这三个dll;
  • 在引用的属性里,把复制到输出目录设置为始终复制;
  • 确认脚本任务的目标.NET版本:右键脚本项目->属性->应用程序,确保目标框架是.NET Framework 4.5,和MongoDB 2.3驱动兼容。

3. 代码小优化(解决编译后运行的潜在问题)

等引用问题解决后,你当前的代码只是创建了查询但没有实际获取数据,可以修改成这样来测试:

public override void CreateNewOutputRows() {
    MongoClient client = new MongoClient("mongodb://dgm-mongodbdev-01.development.dc.opap:27017");
    IMongoDatabase database = client.GetDatabase("sportsbetting-staging");
    IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("event");
    
    // 2.3版本可以用ToList()同步获取数据
    var documents = collection.Find<BsonDocument>(null).Limit(3).ToList();
    foreach(var doc in documents)
    {
        Console.WriteLine(doc.ToString());
        // 这里可以把数据写入SSIS输出行,比如:
        // Output0Buffer.AddRow();
        // Output0Buffer.Id = doc["_id"].ToString();
        // 其他字段同理
    }
}

4. 清理缓存,重新编译

有时候SSIS会缓存旧的引用,你可以:

  • 关闭Visual Studio,删除脚本任务生成的临时文件(通常在C:\Users\<你的用户名>\AppData\Local\Temp\Vsta目录下);
  • 重新打开项目,重新添加引用并编译。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:17:27