Impossible de charger le type « ASP.xxx » lors du référencement d'une page principale précompilés

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

Question

Je tente de précompiler quelques pages principales (pas mise à jour, en mesure) de les partager entre plusieurs applications. Le projet que je suis précompilant est un site Web. Le projet que les références des ensembles précompilés est une application Web. Cependant, je reçois un Impossible de charger le type « ASP.xxx_master » à chaque fois que je tente de faire référence à la page principale du client.

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

Ma précompilés page maître se présente comme suit.

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

Je suis perplexe. Aucune idée pourquoi le type n'est pas résolu. Quelqu'un a des suggestions? Les deux projets (précompilés site web et application web client) sont construits pour ASP.NET 4.0.

EDIT : Voici la liste des dépendances de l'assemblée précompilés. Aucune référence 3ème partie.

mscorlib, Système, System.Web

UDPATE 1

Eh bien, la solution rapide à ce problème consiste à spécifier le chemin complet vers la page principale.

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

Après avoir fait cela, je reçois l'erreur suivante:

Une erreur est survenue lors essayez de charger les ressources de chaîne (FindResource échoué avec l'erreur -2147023083).

Après avoir fait quelques recherches, il semble être lié à la façon dont le balisage HTML est analysé dans la page principale. Pas tout à fait sûr encore. Je ne l'ai pas beaucoup creusé plus profondément en elle. Dans l'ensemble, je ne peux pas croire que c'est la méthode recommandée pour les contrôles des actions qu'il est absolument, mindbogglingly idiotes.

MISE À JOUR 2

Je ne pouvais pas faire quoi que ce soit de la valeur de ce. Il semble haïssant les balises « script » dans la section de la tête, mais je ne sais pas pourquoi. Le Maître page fonctionne très bien avec un seul script inclut. Dès que je commence en ajoutant plus je continue à obtenir cette erreur. Après avoir perdu une journée complète sur ce que je fini par soumettre une rapport de bogue à Microsoft. Si quelqu'un veut il bosse, s'il vous plaît faire.

Mettre à Jour 3

J'ai passé quelques jours de débogage cela après aucune réponse de MS. Voici mes conclusions. Je pensais d'abord que le code généré par le fournisseur CodeDOM est à la recherche d'une ressource .NET qui en quelque sorte ne pas s'incorporé dans l'assemblée quand il a été publié. J'avais tort. Après une enquête, il semble que ce qui se passe est après la page maître atteint une certaine taille, un morceau de celui-ci est stocké dans la table des ressources dans la section PE Répertoires de données de l'ensemble. En fait, après avoir examiné l'ensemble généré dans la visionneuse de ressources PE, je suis en mesure de confirmer en trouvant tout mon script inclut dans le tableau des ressources. Maintenant, voici le problème réel. Ce qui se passe est que le fournisseur de CodeDOM génère un appel à Win32 FindResource pour tirer cette ressource de la table des ressources. Cependant, FindResource ne fonctionne pas sur des ensembles en mémoire, uniquement sur le disque. Donc, il échoue avec l'exception ci-dessus. Je reçois près, mais toujours pas de solution.

Était-ce utile?

La solution

J'ai enfin une solution de contournement. Ce n'est pas assez, mais il résout le problème. Apparemment en utilisant LoadControl de pré-charge précompilés charges de MasterPages toutes les ressources que FindResource ne peut pas trouver autrement. Donc, tout ce que je l'ai fait ici pour faire ce travail.

Dans mon application client j'ai créé une page maître factice (à savoir Dummy.Master) qui fait référence à ma page maître précompilé comme ceci:

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

Maintenant, une page .aspx qui références Dummy.Master besoins de précharger le type MasterPage précompilés comme ceci:

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

            base.OnPreInit(e);
        }

Je ne sais pas pourquoi cela fonctionne, mais il le fait. Ce code doit être exécuté avant que le MasterPage est résolu, si PreInit fonctionnait très bien. Après avoir regardé le code .NET pendant quelques secondes dans le réflecteur, il semble que LoadControl ne fait une compilation de l'ensemble voodoo quand il tente de charger un certain type de contrôle. Alors peut-être quelque chose là-dedans charges que la section de données des ressources de PE. Le meilleur endroit pour le mettre serait dans la classe de base, je suppose que toutes les pages pourraient hériter de. De plus, devrait être mis en mémoire cache chaque contrôle chargé (page maître dans ce cas). Voici un bon article expliquant cela.

Espérons que cela aide quelqu'un autant qu'il m'a aidé. Il était un bouchon de spectacle assez grand pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top