Sql server SSIS C#2012脚本任务在从SQL Server代理运行时引用WinSCPnet.dll失败;调用的目标已引发异常";

Sql server SSIS C#2012脚本任务在从SQL Server代理运行时引用WinSCPnet.dll失败;调用的目标已引发异常";,sql-server,visual-studio-2012,ssis,winscp,winscp-net,Sql Server,Visual Studio 2012,Ssis,Winscp,Winscp Net,我有一个SSIS包(创建于VS2013),其中包含一个C#2012脚本任务 脚本任务的任务是使用WinSCP.NET程序集从SFTP服务器下载文件,并将其放置在我的服务器上(Windows server 2012 R2和SQL server 2014) 当我在我的开发机器上运行包时,它运行良好,但是当我部署到服务器时,我的包在此任务中失败,并显示错误消息 调用的目标已引发异常 我已经做了一些挖掘,它似乎与对WinSCPnet.dll的引用有关。您需要在全局程序集缓存中安装WinSCPnet.d

我有一个SSIS包(创建于VS2013),其中包含一个C#2012脚本任务

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

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

调用的目标已引发异常


我已经做了一些挖掘,它似乎与对
WinSCPnet.dll

的引用有关。您需要在全局程序集缓存中安装WinSCPnet.dll,以便SSI获取此依赖项,有关详细信息,请参阅此。您可以使用以下步骤在GAC中安装DLL,有关详细信息,请参阅:

  • 将WinSCPnet程序集复制到本地计算机的文件夹中。 启动Visual Studio命令提示符
  • 键入以下命令:gacutil.exe/if“”
  • 这会将程序集安装到GAC,覆盖具有相同程序集名称的任何现有程序集
  • 引用WinSCP关于以下内容的文章:

    这只是一个高级例外。根本原因通常存储在数据库中

    如果在SSIS中遇到此异常,可以使用
    try
    catch
    块捕获错误,如的示例所示

    如果无法轻松访问内部异常,请检查WinSCP会话日志和调试日志文件(,)。如果这些文件甚至没有创建,根本原因可能是加载
    WinSCPnet.dll
    程序集。看


    安装总成以允许其装载包括在:

    安装 首先,您需要安装。不要使用NuGet包。1

    您还需要添加或允许加载程序集


    GAC的安装包括:

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

    将程序集安装到GAC时,您需要

    在开发机器上

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

    gacutil.exe/i WinSCPnet.dll
    
    Windows SDK随Microsoft Visual Studio一起提供。您也可以单独安装它

    对您的.NET framework版本使用正确的
    gacutil.exe

    • 对于.NET framework 4.0或更新版本,请使用Windows SDK 7.1(或更新版本)中的
      gacutil

      C:\ProgramFiles(x86)\Microsoft SDK\Windows\v7.1\bin\gacutil.exe
    • 对于.NET framework 3.5,请使用Windows SDK 6.0中的
      gacutil

      C:\ProgramFiles(x86)\Microsoft SDK\Windows\v6.0A\Bin\gacutil.exe
    在生产或用户机器上

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

    • Windows Installer,通过创建
      .msi
    • 支持安装到GAC的任何其他安装程序系统,例如:
    • 。PowerShell示例:

      添加类型-AssemblyName“System.EnterpriseServices”
      $publish=新对象System.EnterpriseServices.Internal.publish
      $publish.GacInstall(“WinSCPnet.dll”)
      
      需要指定DLL的绝对路径,否则上述方法将失败(失败的唯一指示将发送到Windows事件日志)



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


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

    如果GAC中没有.dll,该包是否会停止在Visual Studio中运行?我刚刚在服务器上安装了gacutil并运行了“/l WinSCPnet”命令,结果表明.dll已经安装在GAC上,所以问题一定是其他原因