Impossibile caricare il tipo 'ASP.xxx' quando si fa riferimento una pagina master precompilati

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

Domanda

Sto tentando di precompilare alcune pagine master (non aggiornare-in grado) di condividerle tra più applicazioni. Il progetto a cui sto precompilazione è un sito Web. Il progetto che fa riferimento precompilati assemblee è una Web Application. Tuttavia, sto diventando un tipo Impossibile caricare 'ASP.xxx_master' ogni volta che cerco di fare riferimento alla pagina master dal client.

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

I miei precompilati sguardi pagina master come questo.

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

stumped. Nessuna idea perché il tipo non è stato risolto. Qualcuno ha suggerimenti? Entrambi i progetti (precompilato sito web e applicazioni web client) sono costruiti per ASP.NET 4.0.

Modifica : Ecco l'elenco delle dipendenze del precompilato assemblaggio. Nessun riferimento terzo partito.

mscorlib, Sistema, System.Web

UDPATE 1

Bene, la soluzione rapida a questo problema è quello di specificare il percorso completo della pagina master.

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

Dopo aver fatto questo, sto ricevendo il seguente errore:

Un errore si è verificato durante tenta di caricare le risorse di tipo stringa (FindResource non riuscito con errore -2.147,023083 millions).

Dopo aver fatto qualche ricerca, questo sembra essere correlato al modo in cui HTML markup viene analizzato all'interno della pagina master. Non del tutto ancora sicuro. Non ho scavato molto più in profondità. Nel complesso, non posso credere che questo è il metodo consigliato per i controlli di condivisione in quanto è assolutamente, mindbogglingly idiota.

UPDATE 2

Non ho potuto fare nulla di valore da questo. Sembra essere odiare tag "script" nella sezione di testa, ma non so perché. La pagina master funziona alla grande con un singolo script includere. Appena comincio aggiunta più continuo a ricevere questo errore. Dopo sprecare una giornata intera su questo ho finito per la presentazione di una segnalazione di bug a Microsoft. Se qualcuno vuole bump, si prega di fare.

UPDATE 3

Ho trascorso qualche giorno in più di debug questo dopo alcuna risposta da MS. Ecco i miei risultati. Inizialmente ho pensato che il codice generato dal fornitore CodeDOM è alla ricerca di una risorsa .NET che in qualche modo non ha ottenuto incorporato nel gruppo quando è stato pubblicato. Mi sbagliavo. Dopo alcune indagini sembra che ciò che sta accadendo è dopo la pagina master raggiunge una certa dimensione, un pezzo di esso viene memorizzato nella tabella di risorse nella sezione PE Directory dati del gruppo. Infatti, dopo aver guardato il generato assemblaggio in visualizzatore di risorse PE, sono stato in grado di confermare questo trovando tutto il mio script include nella tabella delle risorse. Ora, qui è il problema reale. Quello che sta succedendo è che il provider CodeDOM genera una chiamata a Win32 FindResource a tirare quella risorsa dalla tabella delle risorse. Tuttavia, FindResource non funziona su assembly in memoria, solo su disco. Così viene a mancare con l'eccezione di cui sopra. Mi sto avvicinando, ma ancora nessuna soluzione.

È stato utile?

Soluzione

ho finalmente una soluzione. Non è bello, ma si risolve il problema. A quanto pare utilizzando LoadControl di precaricare MasterPages precompilati carichi tutte le risorse che FindResource non riesce a trovare altro modo. Così, qui è tutto ho fatto per fare questo lavoro.

Nella mia applicazione client ho creato una pagina master fittizio (vale a dire Dummy.Master) che fa riferimento la mia pagina master precompilato in questo modo:

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

Ora, qualsiasi pagina aspx che i riferimenti Dummy.Master esigenze per precaricare il tipo MasterPage precompilata in questo modo:

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

            base.OnPreInit(e);
        }

Non so perché questo funziona, ma lo fa. Questo codice deve essere eseguito prima che il MasterPage è risolto, in modo PreInit funzionato grande. Dopo guardando il codice NET per alcuni secondi in Reflector, sembra che LoadControl realtà fa qualche voodoo assemblaggio compilazione quando si tenta di caricare un certo tipo di controllo. Quindi, forse qualcosa in là carichi sezione dati risorsa PE. Il posto migliore per mettere sarebbe nella classe base Suppongo che tutte le pagine potrebbero ereditare da. Inoltre, ogni controllo viene caricato (pagina master in questo caso) dovrebbe essere memorizzate nella cache. Ecco un buon articolo che spiega proprio questo.

Speriamo che questo aiuta qualcuno tanto quanto mi ha aiutato. E 'stata una abbastanza grande tappo di spettacolo per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top