【问题标题】:SSIS Script Task getting "Exception has been thrown by the target of an invocation." when running with 3rd party dllSSIS 脚本任务获取“调用的目标已引发异常”。使用 3rd 方 dll 运行时
【发布时间】:2020-11-20 15:52:43
【问题描述】:
我有一个流程已经部署到生产 SQL Server SSIS 目录几年了,并且每天都运行良好。最近进行了更新并进行了部署。事实证明,源代码控制没有最新的工作版本(可能是我的错!)。我通过使用 SSMS 中的 GUI 恢复到最新的工作版本,现在,每当我运行包时,我都会在 C# 脚本任务中得到“异常已被调用目标抛出”。
脚本任务本身不会执行,所以在里面添加断点什么都不做。这是 SSIS 试图执行出错的任务。该脚本引用了 BouncyCastle 的加密库。当我注释掉所有引用该库的代码时,脚本任务成功执行。我什至可以保留 using 语句。
我已尝试删除引用并重新添加它,但无济于事。
【问题讨论】:
标签:
c#
dll
ssis
script-task
【解决方案1】:
在目录中重新设置版本通常就足够了,所以听起来除了 SSIS 包之外可能还有其他东西发生了变化。例如,如果 dll 版本发生了变化,并且相应的版本没有在 GAC 中注册
如果您在 pre-execute 方法中有一个断点并且它仍然无法到达它,那么它很有可能在 BouncyCastle 导入时失败。这些导入通常仅在 dll 在 GAC 中注册时才有效。
或者,您可以将脚本修改为 manually load 文件夹中的 dll,而不是使用反射在 GAC 中查找它
您可以将以下方法添加到脚本并更新路径。请注意,此程序集需要存在于已部署服务器上的该路径中。此代码将告诉脚本在运行时从该文件夹加载 DLL
static ScriptMain()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name.Contains("BouncyCastle.Crypto"))
{
string path = "C:\\SO\\bouncycastle\\";
return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "BouncyCastle.Crypto.dll"));
}
return null;
}