我有一个包含 C# 2012 脚本任务的 SSIS 包(在 VS 2013 中创建)。
脚本任务的工作是使用 WinSCP .NET 程序集从 SFTP 服务器下载文件并将其放在我的服务器上(Windows Server 2012 R2 和 SQL Server 2014)
我的包在我的开发机器上运行时运行良好,但是当我部署到服务器时,我的包在此任务中失败并显示错误消息
调用的目标已抛出异常
我已经进行了一些挖掘,看起来它与对WinSCPnet.dll
.
我有一个包含 C# 2012 脚本任务的 SSIS 包(在 VS 2013 中创建)。
脚本任务的工作是使用 WinSCP .NET 程序集从 SFTP 服务器下载文件并将其放在我的服务器上(Windows Server 2012 R2 和 SQL Server 2014)
我的包在我的开发机器上运行时运行良好,但是当我部署到服务器时,我的包在此任务中失败并显示错误消息
调用的目标已抛出异常
我已经进行了一些挖掘,看起来它与对WinSCPnet.dll
.
引用 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 事件日志)。
如果您已经注册了适当的 Dll 仍然收到此错误,并且您正在传递包范围的变量,请确保将它们添加到脚本任务中的“ReadOnlyVariables”。
右键单击任务并单击“编辑...”,然后单击“ReadOnlyVariables”属性上的“...”,并添加脚本中引用的变量。