Получить ASP.NET сборка из OnInit пользовательского серверного элемента управления?

#c# #asp.net #assemblies #custom-server-controls

#c# #asp.net #сборки #пользовательские серверные элементы управления

Вопрос:

Я пытаюсь создать ASP.NET пользовательский серверный элемент управления, который отображает информацию о версии ASP.NET проект, содержащий страницу, на которой отображается серверный элемент управления.

Каков синтаксис C # для получения сборки этого ASP.NET проект?

То есть, учитывая это переопределение OnInit внутри кода пользовательского серверного элемента управления…

 protected override void OnInit(EventArgs e) {
    System.Reflection.Assembly assembly = Foo();
}
  

… что входит в Foo()?

РЕДАКТИРОВАТЬ: пользовательский серверный элемент управления определен в проекте / сборке библиотеки классов, которая не является ASP.NET проект/сборка.

Ответ №1:

  public Assembly GetPageAssembly()
 {
   var pageType = Page.GetType();
   return Assembly.GetAssembly(pageType.BaseType == null 
                                || pageType.BaseType == typeof (Page)
                                     ? pageType : pageType.BaseType);
 }
  

Независимо от того, где реализован элемент управления, отдельная dll или текущая, в конце он будет создан в классе Page и добавлен в его коллекцию Controls . Эта страница доступна через метод страницы и, основываясь на этом, найдет сборку.

Для файла .aspx (на самом деле их несколько, если больше), ASP .Net создает dll. Если установлен атрибут «Inherit», то сгенерированный класс будет выглядеть примерно так:

 public _Default_aspx : Namespace._Default, IHttpHandler {
}
  

Эта dll отличается от той, которая была скомпилирована Visual Studio, результатом «проекта веб-приложения», и я думаю, что вас больше интересует последняя версия. Эта dll имеет тип «_Default:, который мы видим в Visual Studio:

 public _Default : System.Web.Page
{
}
  

Итак, почему эта короткая история? Когда это.Страница.GetType() вызывается из серверного элемента управления, затем, если установлен атрибут Inherit, метод вернет тип _Default_aspx, но для вас это бесполезно, поскольку вам нужна сборка, созданная Visual Studio, а не сгенерированная ASP .Net из файлов aspx / ascx. Если страница или элемент управления имеют набор атрибутов Inherit , то GetType() этого достаточно.

Зная тип, просто вызовите сборку.Метод GetAssembly возвращает нужную вам сборку.

Комментарии:

1. Я видел из предыдущей версии вас, что вы уже нашли, как получить версию сборки

2. Вызываю сборку. GetExecutingAssembly() выдает мне сборку, в которой определен пользовательский серверный элемент управления, а не ASP.NET сборка (это две разные сборки, важный факт, который я только сейчас включил в вопрос — извините).

3. Вызываю сборку. GetCallingAssembly() дает мне систему .NET. Веб-сборка, а не сборка моего ASP.NET проект.