Итак, мне пришлось получить сборку из ссылочной dll.
В мире asp.NET MVC/WebAPI всегда будет хотя бы один класс, наследуемый от System.Web.HttpWebApplication
. Реализация ниже ищет этот класс.
using System;
using System.Linq;
static Assembly GetWebAssembly() => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetExportedTypes().Any(t => t.BaseType?.FullName == "System.Web.HttpApplication"));
Вышеупомянутое использует System.Linq
, чтобы найти эту связь, но это также может быть реализовано без.
Сначала получаем все загруженные сборки
AppDomain.CurrentDomain.GetAssemblies()
Затем перечислите IEnumerable<Assembly>
и получите все типы, расположенные непосредственно в сборке.
a.GetExportedTypes()
Затем посмотрите, не наследуется ли какой-либо из типов от System.Web.HttpWebApplication
t.BaseType?.FullName == "System.Web.HttpApplication"
В моей реализации я гарантировал, что этот код будет вызываться только один раз, но если это не гарантируется, я бы сильно обернул это в Lazy<T>
или другую кэшированную реализацию отложенной загрузки, поскольку продолжать выполнять слепой поиск довольно дорого.
using System;
using System.Linq;
// original method
private static Assembly GetWebAssembly() => AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetExportedTypes().Any(t => t.BaseType?.FullName == "System.Web.HttpApplication"));
// lazy load implementation
private static Lazy<Assembly> _webAssembly = new Lazy<Assembly>(GetWebAssembly);
public static Assembly WebAssembly { get => _webAssembly.Value; }
person
Kom N
schedule
28.08.2020
typeof(Global)
, а не имя класса для конкретного приложения. - person Joe   schedule 04.01.2012