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依次执行以下操作:
- 用
ildasm导出IL代码:ildasm /out:MongoDB.Driver.il MongoDB.Driver.dll - 用文本编辑器打开生成的
.il文件,找到.assembly MongoDB.Driver部分,添加公钥信息(先通过sn -p MongoKey.snk MongoPubKey.pub导出公钥,再把公钥字符串粘贴进去):.assembly MongoDB.Driver { .publickeytoken = (你的公钥令牌) .ver 2:3:0:157 } - 用
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
相关产品推荐
相关产品推荐

