如何在 SSIS 包中使用 COM 引用?

Posted

技术标签:

【中文标题】如何在 SSIS 包中使用 COM 引用?【英文标题】:How do I use COM reference within SSIS package? 【发布时间】:2012-10-29 18:28:37 【问题描述】:

我正在尝试使用 SSIS 脚本任务中的 Microsoft Shell Controls And Automation COM 对象库 (C:\Windows\System32\shell32.dll) 来操作 .zip 存档。

不幸的是,虽然我已经成功添加了相关的参考并且脚本任务编译正常。我正在使用 VB.NET,这是值得的。一旦我尝试创建在库中定义的任何对象,我就会收到以下运行时错误:

错误:存档文件中的 0x1:System.Reflection.TargetInvocationException:调用目标已引发异常。 ---> System.IO.FileNotFoundException:无法加载文件或程序集“Interop.Shell32,版本=1.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。 文件名:“Interop.Shell32,版本=1.0.0.0,文化=中性,PublicKeyToken=null” 在 ST_a2650b7f39504eaa8c80e37a6736d957.vbproj.ScriptMain.Main()

我以为 Interop DLL 会为我处理好 - 有谁知道我错过了哪一步?

【问题讨论】:

为什么不用 7zip 试试呢? ***.com/questions/222030/… 不幸的是,我需要正在尝试开发的解决方案才能在没有第三方软件的情况下工作:-( 我需要将 Interop.Shell32 程序集安装到 GAC 中吗?如果是这样,我可以从哪里下载 gacutil? 【参考方案1】:

SSIS 需要向 GAC 注册所有 .dll 引用,您是正确的。

关于将此 dll 安装到 GAC 中,您有不同的选择:

    将 .dll 拖放到 %windir%\assembly\ 文件夹中。

    使用您正在考虑使用的 gacutil.exe:关于使用 gacutil 安装到 GAC,这里有很多有用的信息:Global_Assembly_Cache。基本上,如果您安装了 .NET 框架(您使用的是 VB.NET,所以没有问题),您的 Microsoft.NET 文件夹中就会有一个 gacutil.exe。

    (我通常在所有其他方法都失败时使用)在 Visual Studio 中创建一个 Windows MSI 项目,它会自动为您完成所有这些操作,此处提供有用信息How to install assembly in the GAC using MSI

如果您在 GAC 中安装该 .dll 并且仍然遇到问题,另一种选择是实际创建一个单独的 Visual Studio 项目,其中包含您用于操作所需 zip 文件的逻辑构建它并使用 SSIS 从 SSIS 调用其 exe 执行流程任务。您可以传递 SSIS 包中指定的参数。不是很优雅,但如果您热衷于使用 SSIS,它可以完成工作。


更新:

这个问题的解决方案成功了SSIS Script Task COMException / FileNotFoundException error。问题在于添加 dll 的签名引用,此答案为在 SSIS 脚本任务中添加 COM 引用提供了一个很好的分步解决方法。

【讨论】:

我需要将什么 DLL 放入 GAC?我已经尝试安装“Interop.Shell32.dll”和“Shell32.dll”,但都没有成功。当我尝试安装 SSIS 在其临时文件夹中生成的 Interop.Shell32.dll 时,我被告知它没有强名称。安装 Shell32.dll 失败,因为该模块应包含程序集清单。 顺便说一下,使用 Windows 资源管理器通过拖放安装到 GAC 中也不起作用,因为我无法将文件拖放到 C:\Windows\assembly 虚拟文件夹中(甚至当我以管理员身份运行时)。 我必须安装 .NET Framework SDK 才能获得 gacutil。 最后,很遗憾,我无法按照您的最后建议进行探索,因为我没有 Visual Studio - 只有 VSTA。 :-( 我想我可以安装 Visual Studio Express,但对于一个简单的归档问题来说,这是相当大的努力! 顺便说一下,我使用的是 .NET Framework 3.5 - 所以 System.IO.Compression 也不是一个选项。

以上是关于如何在 SSIS 包中使用 COM 引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SSIS 包中使用变量和 SQL 代码?

如何在 ssis 包中的变量中获取当前周星期一的日期

如何从 SSIS 包中检索 SQL Server 实例名称

如何在ssis包中捕获包的启动时间,以毫秒为单位

如何引用同一个包中的结构

SSIS:如何调试在脚本组件内部引用的自定义程序集