Задача сценария служб SSIS не может найти ссылку на сборку

У меня есть пакет служб SSIS, который использует задачу сценария для заполнения таблицы данных данными из различных типов файлов, включая Excel.

Я использую NPOI для чтения данных из Excel и помещаю файл NPOI.dll в ту же папку, что и пакет служб SSIS, и добавляю его в качестве ссылки в задачу сценария. Я Noob, когда дело доходит до NPOI, так что я только сейчас возиться, но даже все же я упал на первое препятствие!

Мой скрипт содержит код ниже (который я скопировал сэтот ответ SA):

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?

Как всегда, любая помощь очень ценится.

 stuartd07 июн. 2016 г., 16:12
Установлено ли для параметра «Копировать локально» значение true в свойствах ссылки?
 Simon Tindall07 июн. 2016 г., 17:13
Да, "Копировать локальный" установлен в true

Ответы на вопрос(2)

упомянутого Ferdipux. Данное решение не работало с пользовательскими переменными, поэтому вам пришлось бы иметь дело с комментариями в документации, чтобы найти «нестатический» подход. Кроме того, опубликованные решения больше не будут работать при развертывании в экземпляре SQL Server 2017 и попытке прочитать сборки из общего сетевого ресурса (System.NotSupportedException). Поэтому я заменил LoadFile (путь) на вызов UnsafeLoadFrom (путь) в качестве обходного пути. Пожалуйста, используйте его только для своих или других известных сборок, а не для скачанных сборок от неизвестных авторов, потому что это будет проблемой безопасности.

Вот рабочий код, на который ссылается 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);
}

...

Решение Вопроса

их нужно добавить в GAC. Вотстатья с рабочим процессом.
Альтернативный подход -предоставить свой собственный AssemblyResolver в коде задачи скрипта.

Ваш ответ на вопрос