我有一个SSIS包(在VS 2013中创建),其中包含C#2012脚本任务。
脚本任务的工作是使用WinSCP .NET程序集从SFTP服务器下载文件并将其放置在我的服务器上(带有SQL Server 2014的Windows Server 2012 R2)
当我在Dev计算机上运行它时,我的程序包运行良好,但是当我将其部署到服务器时,我的程序包在此任务中失败,并显示错误消息
调用的目标已引发异常
我已经进行了一些挖掘,看起来它与对WinSCPnet.dll
的引用有关。
最佳答案
在Exception has been thrown by the target of an invocation上引用WinSCP文章:
这只是一个高级例外。根本原因通常存储在InnerException
中。
如果在SSIS中遇到此异常,则可以使用try
…块捕获错误,如using WinSCP .NET Assembly from SSIS的示例所示。
如果无法轻松访问内部异常,请检查WinSCP会话日志并调试日志文件(catch
,Session.SessionLogPath
)。如果没有创建这些文件,则根本原因可能是加载Session.DebugLogPath
程序集。请参见Could not load file or assembly ‘file:///…\WinSCPnet.dll’ or one of its dependencies. The system cannot find the file specified.。
Installing section of Using WinSCP .NET Assembly from SQL Server Integration Services (SSIS)中介绍了如何安装组件以允许其加载:
正在安装
首先,您需要安装WinSCP .NET assembly。
您还需要install the assembly to the GAC或subscribe WinSCPnet.dll
event允许加载程序集。
Installing to GAC section of Installation instructions for WinSCP .NET assembly涵盖了到GAC的安装:
安装到GAC
在特殊情况下,您可能需要将程序集安装到全局程序集缓存(GAC)中,尤其是要从SSIS使用它。
将程序集安装到GAC时,需要configure a path to WinSCP executable。
在开发机器上
要将程序集安装到开发计算机上的GAC中,即已安装Windows SDK的程序集,请使用以下命令:
gacutil.exe /i WinSCPnet.dll
Windows SDK随Microsoft Visual Studio一起提供。您也可以单独安装。
对您的.NET Framework版本使用正确的
AppDomain.AssemblyResolve
:对于.NET Framework 4.0或更高版本,请使用Windows SDK 7.1(或更高版本)中的
gacutil.exe
:gacutil
;对于.NET Framework 3.5,请使用Windows SDK 6.0中的
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\bin\gacutil.exe
:gacutil
在生产或用户机器上
要将程序集安装到生产或用户计算机上的GAC中,可以使用以下方法将程序集安装到GAC中:
Windows Installer,通过创建
C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Bin\gacutil.exe
包;支持安装到GAC的任何其他安装程序系统,例如Inno Setup;
.msi
method。 PowerShell示例:Add-Type -AssemblyName "System.EnterpriseServices"
$publish = New-Object System.EnterpriseServices.Internal.Publish
$publish.GacInstall("WinSCPnet.dll")
必须指定DLL的绝对路径,否则上述方法将失败(并且唯一的失败指示发送到Windows事件日志)。
关于sql-server - 从SQL Server代理运行时,引用WinSCPnet.dll的SSIS C#2012脚本任务失败,并显示“调用的目标已引发异常”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56734436/