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

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

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

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

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

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

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


person lance    schedule 14.10.2011    source источник


Ответы (1)


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

Независимо от того, где находится реализация элемента управления, отдельная dll или текущая, в конце она будет создана в классе Page и добавлена ​​в его коллекцию Controls. Эта страница доступна через метод Page и на ее основе найдет сборку.
Для файла .aspx (на самом деле их несколько, если больше) ASP .Net создает dll. Если установлен атрибут «Наследовать», то сгенерированный класс будет выглядеть примерно так:

public _Default_aspx : Namespace._Default, IHttpHandler {
}

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

public _Default : System.Web.Page
{
}

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

person Adrian Iftode    schedule 14.10.2011
comment
Я видел из вашей предыдущей версии, что вы уже нашли, как получить версию сборки - person Adrian Iftode; 14.10.2011
comment
Вызов Assembly.GetExecutingAssembly () дает мне сборку, в которой определен настраиваемый серверный элемент управления, а не сборку ASP.NET (это две разные сборки, важный факт, который я только сейчас включил в вопрос - извините). - person lance; 14.10.2011
comment
Вызов Assembly.GetCallingAssembly () дает мне сборку .NET System.Web, а не сборку моего проекта ASP.NET. - person lance; 14.10.2011