Как получить сборку страницы из элемента управления? - PullRequest
1 голос
/ 26 октября 2010

Я создал метод, который получает имя и версию сборки текущей страницы, чтобы отображать ее в нижнем колонтитуле страницы. Это работает просто отлично, но я хотел бы переместить эту логику в элемент управления, который я мог бы перетащить на любую главную страницу проекта веб-приложения, которая ссылается на мою библиотеку элементов управления. Однако в библиотеке управления 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).

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

1 Ответ

1 голос
/ 18 августа 2011

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

Причина в том, что тип страницы генерации во время выполнения, как вы упоминали выше. Я нашел хорошее объяснениев MSDN:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...