プリコンパイルされたマスターページを参照するときにタイプ 'asp.xxx'をロードできませんでした

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

質問

複数のアプリケーションでそれらを共有するために、いくつかのマスターページ(更新可能ではない)を事前コンパイルしようとしています。私がプレシャルするプロジェクトはWebサイトです。事前コンパイルされたアセンブリを参照するプロジェクトは、Webアプリケーションです。ただし、クライアントからマスターページを参照しようとするたびに、「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>

私は困惑しています。タイプが解決されない理由はわかりません。誰かが提案を受けましたか?両方のプロジェクト(事前コンパイルされたWebサイトとクライアントWebアプリケーション)は、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マークアップがマスターページ内で解析される方法に関連しているようです。まだ完全にはわかりません。私はそれをそれほど深く掘っていません。全体として、これがコントロールを共有する推奨される方法であるとは信じられません。

更新2

私はこれから価値のあるものを作ることができませんでした。ヘッドセクションで「スクリプト」タグを嫌っているように見えますが、その理由はわかりません。マスターページは、単一のスクリプトに伴い、うまく機能します。追加を開始するとすぐに、そのエラーが発生し続けます。これで丸一日を無駄にした後、私は最終的に提出しました バグレポート マイクロソフトへ。誰かがそれをぶつけたいなら、してください。

更新3

MSからの応答がなかった後、これをデバッグしてさらに数日費やしました。これが私の発見です。私は当初、Codedom Providerによって生成されたコードが、公開されたときにアセンブリに何らかの形で組み込まれなかった.NETリソースを探していると考えていました。私は間違っていた。いくつかの調査の後、マスターページが特定のサイズに達した後に起こっていることは、そのチャンクがアセンブリのPEデータディレクトリセクションのリソーステーブルに保存されているようです。実際、PEリソースビューアの生成されたアセンブリを見た後、リソーステーブルにすべてのスクリプトが含まれていることを見つけることでこれを確認することができました。さて、ここに実際の問題があります。起こっているのは、Codedom ProviderがWin32 FindResourceへの呼び出しを生成して、そのリソースをリソーステーブルから引き出すことです。ただし、FindResourceはメモリ内のアセンブリでは機能しませんが、ディスクでのみ機能しません。したがって、上記の例外を除いて失敗します。私は近づいていますが、それでも回避策はありません。

役に立ちましたか?

解決

私はついに回避策を持っています。きれいではありませんが、問題を解決します。どうやらLoadControlを使用して事前にロードされたMasterPagesを事前にロードすると、FindResourceが見つけることができないすべてのリソースがロードされます。だから、これが私がこの仕事をするためにしたすべてです。

クライアントアプリケーションで、私のプリコンパイルされたマスターページを参照するダミーマスターページ(つまり、dummy.master)を作成しました。

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

これで、dummy.masterを参照する任意の.aspxページは、以下のような事前コンパイルされた傑作タイプをプリロードする必要があります。

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

            base.OnPreInit(e);
        }

なぜこれが機能するのかわかりませんが、そうです。このコードは、傑作が解決される前に実行する必要があるため、Preinitはうまく機能しました。リフレクターで数秒間.NETコードをちらっと見た後、LoadControlは実際に特定のコントロールタイプをロードしようとするときにVoodooをコンパイルするアセンブリを実際に行うようです。そのため、おそらくそこに何かがそのPEリソースデータセクションをロードします。それを置くのに最適な場所は、すべてのページが継承できると思われる基本クラスにあります。また、各ロードされたコントロール(この場合はマスターページ)はキャッシュされるべきです。 これがまさにそれを説明する良い記事です。

うまくいけば、これが私を助けたのと同じくらい誰かを助けます。それは私にとってかなり大きなショーストッパーでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top