Для проекта в моей компании я делаю пакет, который должен быть установлен на кучу разных сайтов.Мы хотим получать ошибки от регистраторов ошибок, если они установлены.И в настоящее время готовы поддержать Elmah и Exceptional.
Однако мой босс также хочет распространять только 1 пакет для 3 различных возможностей, таких как:
- Веб-сайт с установленным регистратором исключений
- Веб-сайт с установленным StackExchange.Exceptional
- Веб-сайт с установленным 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?Или просто не выполнимо?