Понимание исключений с загруженными DLLC#

Место общения программистов C#
Ответить
Anonymous
 Понимание исключений с загруженными DLL

Сообщение Anonymous »

У меня есть конвейерная система, использующая поток данных TPL в C#. Мое приложение работает следующим образом:
  • Загрузка конфигурации шага из базы данных
  • Для каждого шага конвейера загружается соответствующая dll. к конкретному шагу
  • Вызов (внутри конвейера) метода Execute() блока, известного как шаг
Шаг может вызвать исключение, поэтому я обернул вызов метода выполнения загруженного шага в try-catch. Исключение будет перехвачено, но у меня нет информации, то есть трассировки стека, о том, где оно произошло. Например, я получаю следующее:

24/04/08 13:31:48.914 [Ошибка] Шаг CalculateDestinationToWarehouse: System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.
в LoadSingleArticleIntoWarehouse.CalculateDestinationToWarehouse.Execute(данные ILogicPointContextData)
в Plms.Pipelines.Infrastructure.Builders.PipelineBuilder.c__DisplayClass3_1.d.MoveNext() в E:\ папка\папка\PipelineBuilder.cs:строка 41

Это нормально, но это указывает на основное приложение и ничего не дает мне на этом этапе сторона. Поэтому найти реальную строку, где произошло исключение, сложно.
Что еще более странно, так это то, что путь, указанный в catch в конце, указывает на папку на моем компьютере, где установлено приложение. на совершенно другой машине.
Что мне здесь делать? Должен ли я попытаться добавить файл .pdb для каждого шага? В этом случае файл PDB загружается автоматически во время выполнения? Понятно, что я пытаюсь сделать?

РЕДАКТИРОВАТЬ
Как загрузить соответствующую dll?< /h3>
Я загружаю dll следующим образом:

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

var dllFiles = Directory.GetFiles(_path, "*.dll");

foreach (var dllFile in dllFiles)
{

var dllKey = Path.GetFileNameWithoutExtension(dllFile)?.Split('.')?.LastOrDefault();

// Match Dll with database Dll name configuration
if (attributeDefs.Any(x => x.Key.ToLower() == dllKey?.ToLower()))
{
AddDllStep(dllFile, dllKey);
}
}

private void AddDllStep(string assemblyPath, string key)
{
if (!File.Exists(assemblyPath))
{
_logger.LogError($"No DLL found for path: [{assemblyPath}]");
return;
}

var assemblyDll = Assembly.LoadFrom(assemblyPath);

var stepType = assemblyDll.GetTypes()
.FirstOrDefault(t => typeof(IStep).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);

if (stepType == null)
{
_logger.LogError($"There is no DLL implementing IStep interface");
return;
}
AddOrUpdateStep(key, stepType);
}
AddOrUpdateStep() добавит Type к ConcurrentDictionary();
Как выглядит ваш метод CalculateDestinationToWarehouse.Execute?
Это момент, когда вызывается метод Execute шага (это делается для каждого экземпляра шага). :

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

try
{
return await step.Execute(input);
}
catch (Exception ex)
{
context.Logger?.LogError($"Step {step.StepKey}: {ex}");
return input;
}
Поскольку на каждом этапе может возникнуть другое исключение, я решил использовать общий тип Exception. Может ли это быть проблемой?
Влияет ли загрузка dll в «режиме цепочки» на трассировку стека? Это означает, что если у меня есть программное обеспечение A, которое загружает Dll B и использует его, а затем Dll B, которое загружает Dll C, потеряет ли Dll C трассировку стека при возникновении исключения?

Подробнее здесь: https://stackoverflow.com/questions/782 ... oaded-dlls
Ответить

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

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

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

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

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