2011-04-27 61 views
0

我試圖預編譯一些母版頁(不能更新)以在多個應用程序間共享它們。我正在預編譯的項目是一個網站。引用預編譯程序集的項目是一個Web應用程序。但是,每次我嘗試從客戶端引用母版頁時,我都收到無法加載類型「ASP.xxx_master」。當引用預編譯的母版頁時,無法加載類型「ASP.xxx」

<%@ 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應用程序)都是爲ASP.NET 4.0構建的。

編輯:這是預編譯程序集的依賴關係列表。沒有第三方參考。

mscorlib程序, 系統, 的System.Web

UDPATE 1

好,快速修復這個問題是指定的完整路徑母版頁。

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

這樣做之後,我收到以下錯誤:

An error occurred while try to load the string resources (FindResource failed with error -2147023083).

之後做一些研究,這似乎與HTML標記母版頁中解析的方式。還不完全確定。我還沒有深入瞭解它。總體而言,我不能相信這是分享控制的推薦方式,因爲它絕對是令人難以置信的愚蠢。

更新2

我不能讓任何有價值的東西了這一點。它似乎是討厭頭部的「腳本」標籤,但我不知道爲什麼。 Master Page的功能很好,包含單個腳本。只要我開始添加更多,我一直得到這個錯誤。浪費了一整天的時間後,我終於向微軟提交了一份bug report。如果有人想要碰撞它,請做。

更新3

我花了幾天沒有從MS響應後調試此。這是我的發現。我最初認爲由CodeDOM提供程序生成的代碼正在尋找.NET資源,該資源在發佈時並未嵌入程序集中。我錯了。經過一番調查後,看起來發生了什麼事情是在主頁達到一定大小之後發生的,其中一部分存儲在程序集的PE Data Directories部分的資源表中。事實上,在PE資源查看器中查看生成的程序集後,我可以通過查找資源表中包含的所有腳本來確認這一點。現在,這是實際的問題。發生什麼事是CodeDOM提供程序生成一個調用Win32 FindResource從資源表中拉取該資源。但是,FindResource不適用於內存中的程序集,僅在磁盤上。所以它會因上述例外而失敗。我正在接近,但仍然沒有解決方法。

+0

您是否引用在新項目中爲母版頁創建的程序集文件? – NotMe 2011-04-27 16:14:11

+0

是的,客戶端Web應用程序正在引用我的預編譯網站程序集。我把它扔到反射器中,看到ASP名字空間下的類型。我可以在代碼隱藏中爲客戶端應用程序的任何頁面實例化類型,而不會出現問題。但不是當我嘗試在母版頁中繼承它。 – 2011-04-27 16:16:08

+0

啊,所以你使用的網站,而不是一個Web應用程序?真的希望MS會刪除網站以避免這些問題。 – Phill 2011-05-03 05:13:47

回答

2

我終於有了一個解決方法。這不太好,但它解決了這個問題。顯然,使用LoadControl預加載預編譯的MasterPages會加載FindResource無法找到的所有資源。所以,這是我做的這一切的工作。

在我的客戶端應用程序我創建了一個虛擬的母版頁(即Dummy.Master)的引用,像這樣我的預編譯的母版頁:

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

現在,任何.aspx頁面中它引用Dummy.Master需要預裝預編譯的MasterPage類型如下所示:

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

      base.OnPreInit(e); 
     } 

我不知道這是爲什麼起作用,但它確實起作用。此代碼必須在MasterPage解析之前運行,因此PreInit運行良好。在Reflector中查看.NET代碼幾秒之後,看起來LoadControl實際上會在嘗試加載某種控件類型時執行某些程序集編譯voodoo。所以也許在那裏加載PE資源數據部分。把它放在最好的地方應該是我認爲所有頁面都可以繼承的基類。另外,每個加載的控件(本例中的母版頁)都應該被緩存。 Here is a good article explaining just that.

希望這可以幫助一個人,因爲它幫助了我。這對我來說是一個非常大的表演賽。