Не удалось загрузить тип 'asp.xxx' при ссылке на предварительную главную страницу

StackOverflow https://stackoverflow.com/questions/5807209

Вопрос

Я пытаюсь предварительно совершить несколько главных страниц (не обновляемых), чтобы поделиться ими по нескольким приложениям. Проект, который я предварительно совершает, является веб -сайтом. Проект, который ссылается на предварительные сборы, является веб -приложением. Тем не менее, я получаю, что я не могу загрузить тип 'asp.xxx_master' каждый раз, когда я пытаюсь ссылаться на главную страницу с клиента.

<%@ Master Language="C#" Inherits="ASP.sitebase_master" %>

Моя предварительно скомпилированная главная страница выглядит так.

<%@ Master Language="C#" ClientIDMode="Static" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org  /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="AspNetHead" runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   
    <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=7" /><![endif]-->
    <asp:ContentPlaceHolder ID="MetaContent" runat="server" />
    <title>Web Portal</title>   
    <link href="/media/css/style.css" rel="stylesheet" type="text/css" />
    <link href="/media/js/plugins/colorbox/colorbox.css" rel="stylesheet" type="text/css" />
    <asp:ContentPlaceHolder ID="StyleContent" runat="server" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript" language="javascript"></script>
    <script src="/media/js/plugins/colorbox/jquery.colorbox-min.js" type="text/javascript" language="javascript"></script>
    <script src="/media/js/plugins/filestyle/jquery.filestyle.min.js" type="text/javascript" language="javascript"></script>
    <script src="/media/js/portal.master.js" type="text/javascript" language="javascript"></script>
    <script language="javascript" type="text/javascript">
        PORTAL.debug.init();
        PORTAL.init();
    </script>
    <asp:ContentPlaceHolder ID="ScriptContent" runat="server" />
</head>
<body>
    <div id="hld">  
        <div class="wrapper">
            <form id="AspNetForm" runat="server">
                <asp:ContentPlaceHolder ID="BodyContent" runat="server" />  
            </form>
            <asp:ContentPlaceHolder ID="FooterContent" runat="server" />
        </div>
    </div>
</body>

Я озадачен. Понятия не имею, почему тип не решен. У кого -нибудь есть предложения? Оба проекта (предварительно скомпилированный веб -сайт и клиентское веб -приложение) созданы для ASP.NET 4.0.

РЕДАКТИРОВАТЬ: Вот список зависимостей предварительной сборки. Нет сторонних ссылок.

mscorlib, system, system.web

Udpate 1

Что ж, быстрое решение этой проблемы состоит в том, чтобы указать полный путь к главной странице.

<%@ Master Language="C#" Inherits="ASP.sitebase_master, App_Web_sitebase.master.cdcab7d2" %>

После этого я получаю следующую ошибку:

Произошла ошибка при попытке загрузить строковые ресурсы (FindResource не удалась с ошибкой -2147023083).

После некоторого исследования это, по -видимому, связано с тем, как HTML Markup анализируется на главной странице. Еще не совсем уверен. Я не копался гораздо глубже в этом. В целом, я не могу поверить, что это рекомендуемый способ поделиться контролем, так как это абсолютно, Mindboglingly идиотская.

Обновление 2

Я не мог сделать из этого ничего ценного. Похоже, что он ненавидит теги «скрипта» в разделе головы, но я не знаю, почему. Мастерская страница отлично работает с одним сценарием. Как только я начинаю добавлять больше, я продолжаю получать эту ошибку. После того, как я потратил целый день на это, я отправил отчет об ошибке в Microsoft. Если кто -то хочет ударить это, пожалуйста, сделайте.

Обновление 3

Я провел еще несколько дней, отладку это после отсутствия ответа от MS. Вот мои выводы. Первоначально я думал, что код, сгенерированный поставщиком Codedom, ищет ресурс .NET, который каким -то образом не был встроен в сборку, когда он был опубликован. Я был неправ. После некоторого исследования кажется, что то, что происходит, происходит после того, как главная страница достигает определенного размера, ее кусок хранится в таблице ресурсов в разделе каталоги данных PE в сборке. Фактически, просмотрев сгенерированную сборку в PE Resource Viewer, я смог подтвердить это, обнаружив, что все мой скрипт включает в таблицу ресурсов. Теперь вот фактическая проблема. Что происходит, так это то, что поставщик Codedom генерирует вызов Win32 Findresource, чтобы вытащить этот ресурс из таблицы ресурсов. Тем не менее, FindResource не работает на сборах в памяти, только на диске. Таким образом, это терпит неудачу с вышеупомянутым исключением. Я приближаюсь, но все еще нет обходного пути.

Это было полезно?

Решение

У меня наконец -то есть обходной путь. Это не красиво, но решает проблему. Очевидно, использование LoadControl для предварительной загрузки предварительно скомпилированных мастер-страниц загружает все ресурсы, которые FindResource не может найти иначе. Итак, вот все, что я сделал, чтобы сделать эту работу.

В своем клиентском приложении я создал фиктивную главную страницу (т.е. Dummy.master), которая ссылается на мою предварительную главную страницу, например, так:

<%@ Master Language="C#" Inherits="ASP.sitebase_master, App_Web_sitebase.master.cdcab7d2" %>

Теперь любая страница.

        protected override void OnPreInit(EventArgs e)
        {
            ASP.sitebase_master mp = (ASP.sitebase_master)Page.LoadControl(typeof(ASP.sitebase_master), null);

            base.OnPreInit(e);
        }

Я не знаю, почему это работает, но это так. Этот код должен работать до того, как мастер -страница будет решена, поэтому Preinit работал отлично. После того, как в течение нескольких секунд в просмотре в отражателе в течение нескольких секунд, похоже, что LoadControl фактически выполняет некоторую сборку вуду, когда он пытается загрузить определенный тип управления. Так что, возможно, что -то там загружает раздел данных PE. Лучшее место, чтобы выразить это, было бы в базовом классе, я полагаю, что все страницы могли бы наследовать. Кроме того, каждый загруженный элемент управления (в данном случае главную страницу) должен быть кэширован. Вот хорошая статья, объясняющая именно это.

Надеюсь, это поможет кому -то так же сильно, как и мне. Для меня это была довольно большая шоу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top