Загрузите StackExchange.Exceptional динамически - PullRequest
0 голосов
/ 26 ноября 2018

Для проекта в моей компании я делаю пакет, который должен быть установлен на кучу разных сайтов.Мы хотим получать ошибки от регистраторов ошибок, если они установлены.И в настоящее время готовы поддержать Elmah и Exceptional.

Однако мой босс также хочет распространять только 1 пакет для 3 различных возможностей, таких как:

  1. Веб-сайт с установленным регистратором исключений
  2. Веб-сайт с установленным StackExchange.Exceptional
  3. Веб-сайт с установленным Elmah

Чтобы сделать это возможным, я пытаюсь динамически загружать библиотеки DLL этих пакетов регистратора и вызывать методынеобходимо или получить параметр.

Это прекрасно работает для Эльмы, например, сделав следующее:

Assembly assembly = Assembly.LoadFile(HostingEnvironment.MapPath("~/bin/Elmah.dll"));

Type type = assembly.GetType("Elmah.ErrorLog");

object[] parameters = new object[1];
parameters[0] = null;

var customResult = type.InvokeMember("GetDefault", BindingFlags.InvokeMethod, null, type, parameters);

Type myType = customResult.GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

string result = "";

foreach (PropertyInfo prop in props)
{
    if (prop.Name == "Name")
        result = prop.GetValue(customResult, null).ToString();
}

Который прямо сейчас просто получает имя по умолчанию ErrorLog

Затем перейдем к Exceptional и попробуем аналогичный подход:

Assembly assembly = Assembly.LoadFile(HostingEnvironment.MapPath("~/bin/StackExchange.Exceptional.dll"));

Type type = assembly.GetType("StackExchange.Exceptional.ExceptionalModule");

object objectInstance = Activator.CreateInstance(type);

PropertyInfo info = type.GetProperty("ErrorStore");
foreach(PropertyInfo property in type.GetProperties())
{
    LogHelper.Info<Exceptional>(property.Name + ": " + property.GetValue(objectInstance, null));
}

Этот фрагмент кода должен попытаться получить имя ErrorStore используемого по умолчанию ErrorStore.С некоторыми записями для тестирования и тому подобным.

Однако в этот момент он должен что-то делать с параметром "Default" класса "ErrorStore", который должен возвращать ErrorStore по умолчанию.Я всегда получаю исключение:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentOutOfRangeException: ErrorStore 'type' must be specified
Parameternaam: settings
bij StackExchange.Exceptional.ErrorStore.GetFromSettings(ErrorStoreSettings settings)
bij StackExchange.Exceptional.ErrorStore.GetErrorStoreFromConfig()
bij StackExchange.Exceptional.ErrorStore.get_Default()
bij StackExchange.Exceptional.ExceptionalModule.get_ErrorStore()
--- Einde van intern uitzonderingsstackpad ---
bij System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
bij System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,   Object[] parameters, Object[] arguments)
bij System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bij System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
bij System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
bij h5ysr_package.Exceptions.Exceptional.ExceptionalErrors()
bij h5ysr_package.DataCollectorSender.<StartCollection>d__3.MoveNext()

, что привело меня к той части кода, которая выдает ошибку:

if (settings.Type.IsNullOrEmpty())
        throw new ArgumentOutOfRangeException(nameof(settings), "ErrorStore 'type' must be specified");

Это часть исключительного пакета и, следовательно, доступнаямной через код.

Есть ли способ убедиться, что тип указывается при динамической загрузке StackExchange.Exceptional dll?Или просто не выполнимо?

...