Ich konnte den Typ 'ASP.xxx' nicht laden, wenn man auf eine vorkompilierte Master -Seite Bezug genommen hat

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

Frage

Ich versuche, ein paar Master-Seiten (nicht aktualisierbar) vorzubereiten, um sie über mehrere Anwendungen hinweg zu teilen. Das Projekt, das ich vorkompiliert habe, ist eine Website. Das Projekt, das sich verweist, ist eine Webanwendung. Ich bekomme jedoch jedes Mal, wenn ich versuche, die Masterseite vom Client zu verweisen, nicht zu laden, wenn ich versuche, den Typ 'ASP.XXX_MASTER' zu laden.

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

Meine vorkompilierte Master -Seite sieht so aus.

<%@ 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>

Ich bin ratlos. Keine Ahnung, warum der Typ nicht gelöst wird. Hat jemand Vorschläge? Beide Projekte (vorkompilierte Website und Client -Webanwendung) sind für ASP.NET 4.0 erstellt.

BEARBEITEN: Hier ist die Liste der Abhängigkeiten der vorkompilierten Montage. No Dritt Party Referenzen.

mscorlib, System, System.Web

Udpate 1

Nun, die schnelle Lösung dieses Problems besteht darin, den vollständigen Pfad zur Masterseite anzugeben.

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

Danach erhalte ich den folgenden Fehler:

Bei dem Versuch, die String -Ressourcen zu laden, trat ein Fehler auf (FindResource ist mit Fehler -2147023083 fehlgeschlagen).

Nach einigen Nachforschungen scheint dies mit der Art und Weise in Verbindung zu stehen, wie das HTML -Markup auf der Masterseite analysiert wird. Noch nicht ganz sicher. Ich habe nicht viel tiefer in sie gegraben. Insgesamt kann ich nicht glauben, dass dies die empfohlene Möglichkeit ist, Kontrollen zu teilen, da dies absolut idiotisch ist.

Update 2

Daraus konnte ich nichts von Wert machen. Es scheint "Skript" -Tags im Kopfabschnitt zu hassen, aber ich weiß nicht warum. Die Master -Seite funktioniert hervorragend mit einem einzigen Skript. Sobald ich mehr hinzufüge, bekomme ich diesen Fehler immer wieder. Nachdem ich einen ganzen Tag damit verschwendet hatte Fehlerbericht nach Microsoft. Wenn jemand es stoßen möchte, tun Sie dies bitte.

Update 3

Ich habe noch ein paar Tage damit verbracht, dies nach keiner Antwort von MS zu debuggen. Hier sind meine Ergebnisse. Ich dachte zunächst, dass der vom Codedom -Anbieter generierte Code nach einer .NET -Ressource sucht, die bei der Veröffentlichung irgendwie nicht in die Montage eingebettet wurde. Ich lag falsch. Nach einigen Untersuchungen scheint es, dass das passiert, nachdem die Master -Seite eine bestimmte Größe erreicht hat. Ein Teil davon wird in der Ressourcentabelle im Abschnitt PE -Datenverzeichnisse der Montage gespeichert. Nachdem ich mir die generierte Assembly in PE Resource Viewer angesehen hatte, konnte ich dies bestätigen, indem ich mein gesamtes Skript in der Ressourcentabelle fand. Jetzt ist hier das eigentliche Problem. Was passiert, ist, dass der Codedom -Anbieter einen Aufruf an Win32 FindResource generiert, um diese Ressource aus der Ressourcentabelle zu ziehen. FindResource funktioniert jedoch nicht auf den Speicherbaugruppen, nur auf der Festplatte. Es scheitert also mit der obigen Ausnahme. Ich komme näher, aber immer noch keine Problemumgehung.

War es hilfreich?

Lösung

Ich habe endlich eine Problemumgehung. Es ist nicht schön, aber es löst das Problem. Anscheinend lädt die Verwendung von LoadControl zur vorladenden vorkompilierten Meisterpages alle Ressourcen, die FindResource findet, nicht anders. Also, hier ist alles, was ich getan habe, um diese Arbeit zu machen.

In meiner Client -Anwendung habe ich eine Dummy -Master -Seite (dh Dummy.master) erstellt, auf der meine vorkompilierte Master -Seite verweist:

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

Jede .aspx -Seite, auf die sich Dummy.Master verweist.

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

            base.OnPreInit(e);
        }

Ich weiß nicht, warum das funktioniert, aber es tut es. Dieser Code muss ausgeführt werden, bevor die Meisterseite behoben ist, sodass Preinit großartig funktioniert hat. Nachdem Sie einige Sekunden lang in Reflektor auf den .NET -Code geschaut haben, scheint es, dass LoadControl tatsächlich einige Assembly -Kompilien -Voodoo durchführt, wenn versucht wird, einen bestimmten Steuertyp zu laden. Vielleicht lädt etwas darin den Abschnitt "PE -Ressourcendaten". Der beste Ort, um es auszudrücken, wäre in der Basisklasse, von denen alle Seiten erben könnten. Außerdem sollte jede geladene Steuerung (in diesem Fall in diesem Fall) zwischengespeichert werden. Hier ist ein guter Artikel, der genau das erklärt.

Hoffentlich hilft dies jemandem genauso wie es mir geholfen hat. Es war ein ziemlich großer Show -Stopper für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top