我正在通过 Biml 创建一个 SSIS 项目(根据Varigence BimlExpress 页面使用当前版本的 BimlExpress ),该项目在数据流任务中使用脚本组件。该项目的创建没有问题,但是在到达脚本组件时出现错误:
无法加载文件或程序集“Microsoft.SqlServer.DTSPipelineWrap,版本=14.100.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91”或其依赖项之一。该系统找不到指定的文件。
在 ScriptMain.PreExecute() 在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PreExecute()
我可以在 GAC 中看到这个 dll,当我尝试手动添加引用时,SSIS 声明我无法添加它,因为它已经包含在项目中。
但是,如果我打开脚本组件并手动打开Build
它——但不做任何更改——数据流任务将毫无问题地运行。
澄清一下,我知道我没有改变任何其他内容,因为每次我想测试一种提供一致基线的新方法时,我都从 Biml 重新创建这个项目。
有谁知道为什么包含对 GAC dll 的引用的脚本组件只能在手动Built
而不是事先工作时工作?
尽管在不同的环境中,我之前使用过这个精确的 Biml 没有问题。针对 SQL Server 2016 实例使用 Visual Studio 2012 工作,但在针对 SQL Server 2016 实例的 Visual Studio 2015(针对 2012 年)中没有。
对于进一步的上下文,我还测试了这个输出针对 SQL Server 2012、2014 和 2016 的 SSIS 项目,并带有完全相同的错误消息。
更新
作为 BimlExpress 的输出,这似乎肯定是项目中的 dll 版本问题,因为如果我在脚本组件中手动创建v4.0_14.100.0.0__89845dcd8080cc91
包含 13 版 dll 的文件夹,现在会出现以下错误:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.DTSPipelineWrap
System.InvalidCastException:无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100”。此操作失败,因为对具有 IID '{ ID 已删除以防万一}'的接口的 COM 组件调用 QueryInterface 调用失败,原因是以下错误:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE))。
在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(异常 e)
在 Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PreExecute()
在 Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 包装器)