Почему задача сценария SSIS не может вернуть точную информацию об ошибке при отсутствующей DLL?C#

Место общения программистов C#
Ответить
Anonymous
 Почему задача сценария SSIS не может вернуть точную информацию об ошибке при отсутствующей DLL?

Сообщение Anonymous »

Мы выяснили, что для использования библиотек в задаче «Скрипт» пакетов SSIS нам необходимо вручную добавить DLL в GAC (глобальный кэш сборок) и добавить ссылку на файл DLL в редакторе кода задачи «Скрипт». Дополнительную информацию см. в этом посте.
Однако мы все еще задаемся вопросом, как получить точную индикацию в задаче сценария SSIS, если в будущем будут пропущены другие DLL.
Как создать тестовый сценарий
Используя AWSSDK.Core.dll только в качестве примера, мы можем создать ошибку отсутствующей DLL одним из следующих способов:
  • в каталог C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn\ и переименуйте AWSSDK.Core.dll в AWSSDK.Core.dll.bak. В этом случае система не сможет найти DLL для связывания.
  • Или вызовите gacutil -u AWSSDK.Core, чтобы отменить регистрацию. Таким образом, мы можем создать ошибку при тестировании в Visual Studio, но не при развертывании SQL Server.
Подробнее о проблеме и обходном пути
Если задача «Скрипт» использует следующий исходный код, то RegionEndpoint Region = RegionEndpoint.USeast1; требует библиотеки AWS, поэтому отсутствие DLL приведет к следующему сообщению об ошибке в Visual Studio без четкого указания.

at System.RuntimeMethodHandle.InvokeMethod(цель объекта, аргументы Object[], подпись подписи, логический конструктор)

at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, параметры Object[], аргументы Object[])

at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags ignoreAttr, связыватель Binder, параметры Object[], культура CultureInfo)

at System.RuntimeType.InvokeMember(имя строки, BindingFlags привязкаFlags, связыватель Binder, цель объекта, Object[] предоставленные аргументы, модификаторы ParameterModifier[], культура CultureInfo, String[]nameParams)

в Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

Код: Выделить всё

public void Main()
{
try
{
RegionEndpoint region = RegionEndpoint.USEast1;
bool fireAgain = false;
Dts.Events.FireInformation(0, "Test", region.SystemName, string.Empty, 0, ref fireAgain);
}
catch (Exception ex)
{
Dts.Events.FireError(0, "Error", ex.Message, string.Empty, 0);
throw;
}

Dts.TaskResult = (int)ScriptResults.Success;
}
Мы предпочитаем видеть исключение из-за отсутствия DLL, и по счастливому совпадению мы нашли обходной путь: 1) изменить функции на асинхронные и 2) обернуть функциональную логику в другую функцию для вызова внутри Main().
Итак, не очень элегантно, нам нужно изменить исходный код на следующее:

Код: Выделить всё

#pragma warning disable CS1998
public async System.Threading.Tasks.Task Main()
#pragma warning restore CS1998
{
try
{
this.ScriptAction().GetAwaiter().GetResult();
}
catch (Exception ex)
{
Dts.Events.FireError(0, "Error", ex.Message, string.Empty, 0);
throw;
}

Dts.TaskResult = (int)ScriptResults.Success;
}

#pragma warning disable CS1998
async System.Threading.Tasks.Task ScriptAction()
#pragma warning restore CS1998
{
RegionEndpoint region = RegionEndpoint.USEast1;
bool fireAgain = false;
Dts.Events.FireInformation(0, "Test", region.SystemName, string.Empty, 0, ref fireAgain);
}
Вопросы
  • Мы до сих пор не понимаем, почему описанный выше обходной путь может точно вернуть исключение отсутствующей DLL, например

    [Файл не найден] Ошибка: отсутствует необходимая сборка: AWSSDK.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=885c28607f98e604

    но прямой void Main() не может.
  • Как видите, нам приходится подавлять предупреждения компилятора с помощью #pragma alert отключить CS1998, а также, насколько нам известно, задача SSIS Script Task не поддерживает async/await очень хорошо, и на самом деле в нашей логике нет никакой асинхронной операции. Итак, есть ли лучший способ?
  • Возможно ли, что задача сценария SSIS может пропустить больше исключений, помимо отсутствия DLL? Если да, то как это предотвратить?
Мы будем очень признательны за любые подсказки и предложения.

Подробнее здесь: https://stackoverflow.com/questions/794 ... -missing-d
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»