2010-10-25 3 views
1

Я создал метод, который получает имя и версию сборки текущей страницы, чтобы я мог отображать ее в нижнем колонтитуле страницы. Он работает отлично, но я хотел бы переместить эту логику в элемент управления, который я мог бы занять на любую главную страницу проекта веб-приложения, которая ссылается на мою библиотеку управления. Однако в библиотеке управления Assembly.GetExecutingAssembly() возвращает сборку библиотеки управления, а не сборку веб-проекта.Как получить сборку страницы из элемента управления?

Вот метод:

private string GetVersion() 
    { 
     const string cacheKey = "Web.Controls.ApplicationVersion"; 
     string version = (string) Page.Cache[cacheKey]; 
     if (version == null) 
     { 
      Assembly assembly = Assembly.GetExecutingAssembly(); 

      // get the assembly version 
      Version assemblyVersion = assembly.GetName().Version; 

      // get the product name 
      string productName; 
      AssemblyProductAttribute productAttribute = 
       assembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false).Cast 
        <AssemblyProductAttribute>().FirstOrDefault(); 
      if (productAttribute != null) 
      { 
       productName = productAttribute.Product; 
      } 
      else 
      { 
       productName = String.Empty; 
      } 

      version = String.Format("{0} {1}", productName, assemblyVersion); 

      Page.Cache[cacheKey] = version; 
     } 

     return version; 
    } 

Я также попытался Assembly.GetEntryAssembly() который возвращает нуль, и Assembly.GetCallingAssembly(), который возвращает блок управления. Наконец, я попробовал Assembly.GetAssembly(Page.GetType()), который возвращает тип страницы, сгенерированный во время выполнения (ASP.abc).

Как я могу получить сборку веб-проектов из контекста элемента управления, не запрашивая его явно по имени?

+0

На данный момент я добавил свойство ApplicationType в элемент управления, который я использую, чтобы создать экземпляр Type и получить сборку с 'Assembly.GetAssembly (type)'. Это не идеальный, но он работает. – jrummell

ответ

1

Возможно, это не вовремя. Но сегодня я столкнулся с тем же вопросом. И первым, что я обнаружил, ваши вопросы без ответа (Позже я откапывал вокруг этого вопроса Ответ:... Assembly.GetAssembly(Page.GetType().BaseType)

Причина в том, тип страницы поколения во время выполнения, как вы уже упоминалось выше Хорошее объяснение, которое я нашел в библиотеке MSDN :

Тип обработчика HTTP для конкретной страницы зависит от URL Первый раз URL вызывается, новый класс составлен и динамически компилируется в сборе исходный код класса.. результат анализа процесса, который исследует источники .aspx.Классопределяется как часть пространства имен ASP и ему присваивается имя, которое имитирует исходный URL. Например, если конечная точка URL равна page.aspx, то имя класса будет ASP.Page_aspx. Однако имя класса можно программно контролировать, установив атрибут ClassName в директиве @Page.

Базовый класс для обработчика HTTP - Страница. Этот класс определяет минимальный набор методов и свойств , используемых всеми обработчиками страниц. Класс Page реализует интерфейс IHttpHandler.

В нескольких случаях базовый класс для фактического обработчика не Страница, а другой класс. Это происходит, например, если используется код . Code-behind - это способ разработки, который изолирует код, необходимый для страницы, в отдельный класс C# или Microsoft Visual Basic® .NET. Код страницы - это набор событий обработчиков и вспомогательных методов, которые фактически создают поведение страницы . Этот код можно определить встроенным, используя тег или помещенный во внешний класс - класс кода. Класс code-behind - это класс, который наследуется от страницы и специализируется на дополнительных методах. Когда указано, класс code-behind используется как базовый класс для обработчика HTTP.

Поэтому, когда вы используете Page.GetType(), вы получите динамический составной класс. И этот класс унаследован от фактического класса страницы, а этот - в сборке проекта. http://msdn.microsoft.com/en-us/library/aa479007.aspx -MSDN статья refference.