繁体   English   中英

SSIS 脚本任务获取“调用目标已抛出异常”。 使用第 3 方 dll 运行时

[英]SSIS Script Task getting "Exception has been thrown by the target of an invocation." when running with 3rd party dll

我有一个流程已部署到生产 SQL Server SSIS 目录已有几年了,并且每天都运行良好。 最近进行了更新并进行了部署。 事实证明,源代码管理没有最新的工作修订版(可能是我的错!)。 我通过在 SSMS 中使用 GUI 恢复到最新的工作版本,现在,每当我运行包时,我都会在 C# 脚本任务中收到“调用目标抛出异常”。

脚本任务本身不执行,所以在里面添加断点什么也不做。 SSIS 试图执行出错的任务。 该脚本引用了 BouncyCastle 的加密库。 当我注释掉所有引用库的代码时,脚本任务成功执行。 我什至可以保留在 using 语句中。

我尝试删除引用并重新添加它无济于事。

将版本重新设置在目录上通常就足够了,所以听起来除了 SSIS 包之外,其他东西可能已经改变了。 例如,如果 dll 版本已更改并且相应的版本未在 GAC 中注册

如果您在 pre-execute 方法中有一个断点并且它仍然无法到达它,那么它很有可能在 BouncyCastle 导入时失败。 这些导入通常仅在 dll 已在 GAC 中注册时才有效。

或者,您可以修改脚本以从文件夹手动加载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;
}

DLL 位置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM