【问题标题】: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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 2021-02-25
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多