4

我有一个包含 C# 2012 脚本任务的 SSIS 包(在 VS 2013 中创建)。

脚本任务的工作是使用 WinSCP .NET 程序集从 SFTP 服务器下载文件并将其放在我的服务器上(Windows Server 2012 R2 和 SQL Server 2014)

我的包在我的开发机器上运行时运行良好,但是当我部署到服务器时,我的包在此任务中失败并显示错误消息

调用的目标已抛出异常

在此处输入图像描述

我已经进行了一些挖掘,看起来它与对WinSCPnet.dll.

4

3 回答 3

2

引用 WinSCP 关于Exception 的文章已被调用的目标抛出

这只是一个高级别的例外。根本原因通常存储在InnerException.

如果您在 SSIS 中遇到此异常,您可以使用try...catch块来捕获错误,如使用 SSIS 中的 WinSCP .NET 程序集的示例中所示。

如果您无法轻松访问内部异常,请检查 WinSCP 会话日志和调试日志文件 ( Session.SessionLogPath, Session.DebugLogPath)。如果甚至没有创建这些文件,则根本原因可能是加载WinSCPnet.dll程序集。请参阅无法加载文件或程序集 'file:///...\WinSCPnet.dll' 或其依赖项之一。该系统找不到指定的文件。.


从 SQL Server Integration Services (SSIS) 使用 WinSCP .NET 程序集的安装部分介绍了安装程序集以允许其加载:

安装

首先,您需要安装WinSCP .NET 程序集。不要使用 NuGet 包。1

您还需要将程序集安装到 GAC订阅AppDomain.AssemblyResolve事件以允许加载程序集。


安装到 GAC 包含在 WinSCP .NET 程序集的安装说明的安装到 GAC 部分中

安装到 GAC

在特殊情况下,您可能需要将程序集安装到全局程序集缓存 (GAC) 中,特别是从SSIS使用它。

将程序集安装到 GAC 时,需要配置 WinSCP 可执行文件的路径

在开发机上

要将程序集安装到开发机器上的 GAC 中,即安装了Windows SDK的机器,请使用以下命令:

gacutil.exe /i WinSCPnet.dll

Windows SDK 随 Microsoft Visual Studio 一起提供。您也可以单独安装它。

使用正确gacutil.exe的 .NET 框架版本:

  • 对于 .NET 框架 4.0 或更高版本,gacutil从 Windows SDK 7.1(或更高版本)使用
    C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\bin\gacutil.exe
  • 对于 .NET 框架 3.5,gacutil从 Windows SDK 6.0 使用:
    C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Bin\gacutil.exe

在生产或用户的机器上

要将程序集安装到生产或用户机器上的 GAC 中,您可以使用以下命令将程序集安装到 GAC 中:

  • Windows Installer,通过创建.msi包;

  • 任何其他支持安装到 GAC 的安装程序系统,例如Inno Setup

  • System.EnterpriseServices.Internal.Publish.GacInstall方法。PowerShell 示例:

    Add-Type -AssemblyName "System.EnterpriseServices"
    $publish = New-Object System.EnterpriseServices.Internal.Publish
    $publish.GacInstall("WinSCPnet.dll")
    

    需要指定 DLL 的绝对路径并且需要管理员权限。否则上述方法将失败(并且失败的唯一指示将发送到 Windows 事件日志)。


  1. 请参阅如何在 SSIS 脚本任务中修复 NuGet WinSCP.NET?
于 2015-12-18T06:15:01.550 回答
1

您需要在 SSIS 的全局程序集缓存中安装 WinSCPnet.dll 以获取此依赖项,请参阅此博客了解更多详细信息。您可以使用以下步骤在 GAC 中安装 DLL,有关详细信息,请参阅文档

  1. 将 WinSCPnet 程序集复制到本地计算机的文件夹中。启动 Visual Studio 命令提示符。
  2. 键入以下命令: gacutil.exe /if ""
  3. 这会将程序集安装到 GAC,覆盖具有相同程序集名称的任何现有程序集。
于 2015-12-17T22:08:59.453 回答
1

如果您已经注册了适当的 Dll 仍然收到此错误,并且您正在传递包范围的变量,请确保将它们添加到脚本任务中的“ReadOnlyVariables”。

右键单击任务并单击“编辑...”,然后单击“ReadOnlyVariables”属性上的“...”,并添加脚本中引用的变量。

于 2017-04-13T16:11:23.920 回答