【问题标题】:SSIS Script Task cant find reference to assemblySSIS 脚本任务找不到对程序集的引用
【发布时间】:2016-06-07 14:04:49
【问题描述】:

我有一个 SSIS 包,它使用脚本任务来使用来自各种不同文件类型(包括 excel)的数据填充数据表。

我正在使用 NPOI 从 Excel 中读取数据,并将 NPOI.dll 文件放在与 SSIS 包相同的文件夹中,并将其添加为脚本任务中的参考。在 NPOI 方面我是菜鸟,所以我现在只是在修补,但即使如此,我还是在第一关就跌倒了!

我的脚本包含以下代码(我从this SA answer 复制的):

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

HSSFWorkbook wb;
using (FileStream file = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
{
    wb = new HSSFWorkbook(file);
}

但失败并显示以下错误消息:Could not load file or assembly 'NPOI, Version=2.1.1.0, Culture=neutral, PublicKeyToken=0df73ec7942b34e1' or one of its dependencies. The system cannot find the file specified

但是当我进入脚本任务时,参考在那里并且没有错误。

如果我注释掉除了我声明 HSSFWorkBook 称为 wb 的第一行之外的所有内容,它运行正常。

我是否错误地添加了引用,或者添加对 SSIS 脚本任务的引用非常困难?

非常感谢任何帮助。

【问题讨论】:

  • 引用属性中的“复制本地”是否设置为 true?
  • 是“复制本地”设置为 true

标签: c# dll ssis npoi


【解决方案1】:

对于要在脚本任务中引用和执行的自定义程序集,您必须将它们添加到 GAC。这是an article with workflow
替代方法 - 脚本任务代码中的 provide your own AssemblyResolver

【讨论】:

    【解决方案2】:

    这是 Ferdipux 提到的自定义 AssemblyResolver 方法的示例。 给定的解决方案不适用于用户变量,因此您必须处理文档中的 cmets 才能找到“非静态”方法。 此外,当您部署到 SQL Server 2017 实例并尝试从网络共享中读取程序集 (System.NotSupportedException) 时,发布的解决方案将不再有效。 因此,我用 UnsafeLoadFrom(path) 调用替换了 LoadFile(path) 作为解决方法。请仅将其用于您自己或其他知名程序集,而不是从未知作者处下载的程序集,因为这将是一个安全问题。

    这是工作代码,引用的 DLL 是“System.Web.Helpers.dll”,网络共享路径在用户变量“LibPath”中配置(VS 2015,SQL Server 2017):

    public System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string path = Variables.LibPath.ToString();
    
        if (args.Name.Contains("System.Web.Helpers"))
        {
            return System.Reflection.Assembly.UnsafeLoadFrom(System.IO.Path.Combine(path, "System.Web.Helpers.dll"));
        }
    
        return null;
    }
    
    /// <summary>
    /// This method is called once, before rows begin to be processed in the data flow.
    /// </summary>
    public override void PreExecute()
    {
        base.PreExecute();
    
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    }
    

    ...

    【讨论】:

      【解决方案3】:
      static ScriptMain()
              {
                  AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
              }
              static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
              {
                  //(string)Dts.Variables["User::CustomDLL"].Value;
                  if (args.Name.Contains("HtmlAgilityPack"))
                  {
                      string path = @"C:\Temp\";
                      return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "HtmlAgilityPack.dll"));
                      //return System.Reflection.Assembly.UnsafeLoadFrom(System.IO.Path.Combine(path, "HtmlAgilityPack.dll"));
                  }
                  return null;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        相关资源
        最近更新 更多