2013-04-26 30 views
0

我在Visual Studio 2008的ASP.NET 3.5 Web應用程序項目中對用戶控件(.ascx文件)進行了一些更改。我注意到我在標記中所做的更改未反映在設計器文件中(相當於well-knownproblem)。我嘗試刪除設計器文件並使用「轉換爲Web應用程序」重新生成它。在這樣做時,我得到這個錯誤:將自定義ExpressionBuilder標記添加到.ascx時出現「設計器文件生成失敗」

Generation of designer file failed: Could not load type 'MyWebApplication.MyCustomExpressionBuilder' from assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. (E:\MyPath\MyWebApplication\Web.config line 166)

我在的.ascx標記作出改變是使用一個custom ExpressionBuilder作爲我的.ascx內的Visible和/或Enabled某些控件的屬性的值。此特定的ExpressionBuilder已成功用於Web應用程序中的其他位置,以將布爾值返回到相似的屬性。例如:

<asp:TableRow runat="server" Visible="<%$ MyCustom: TheExpressionValue %>"> 
    <%-- some TableCells and contents here --%> 
</asp:TableRow> 

在Web.config線錯誤消息指出是add標籤如下所示:

<system.web> 
    <compilation debug="true"> 
     <!-- Skipping the 'assemblies' and 'buildProviders' areas --> 
     <expressionBuilders> 
      <add expressionPrefix="MyCustom" type="MyWebApplication.MyCustomExpressionBuilder" /> 
     </expressionBuilders> 
    </compilation> 
    <!-- other stuff --> 
</system.web> 

MyCustomExpressionBuilder是在同一個Web應用程序項目在一個名爲Code目錄(不是App_Code,無論出於何種原因,我不知道如果我移動類文件,會損失多少)。

我可以解決此問題,如果必須避免控件中的自定義ExpressionBuilder並添加調用頁面的一些屬性來代替使用,但這不會很理想。請注意,內置表達式(如<%$ Resources: CommonResource, SomeTextString %>)已經在控制中並且工作正常。

這裏有一些事情我已經嘗試:

  1. 剛剛重建項目。設計器文件無法加載,並且由於缺少屬性,導致代碼隱藏中出現很多構建錯誤。
  2. 只需更改控件標記,保存並更改控件(在嘗試刪除設計器文件之前),確保沒有打開設計器文件。這個過程默默地失敗了。
  3. ClassName參數添加到我的<%@ Control %>指令中,如建議here。沒有效果。
  4. 添加<%@ Assembly Name="MyWebApplication" %>。沒有效果。
  5. 添加<%@ Import Namepace="MyWebApplication" %>。沒有效果。加入<%@ Reference VirtualPath="~/Code/MyCustomExpressionBuilder.cs" %>。沒有效果。
  6. 關閉並重新啓動Visual Studio。在第一次嘗試在ascx上運行「轉換爲Web應用程序」時,至少我得到了一個不同的錯誤:「拋出了'System.Exception'類型的異常。」嘗試重建項目並獲取所有錯誤(參見上面的#1)後,「轉換爲Web應用程序」會產生與以前一樣的「生成設計器文件失敗」錯誤消息。

將項目升級到新的Visual Studio版本目前不是一個選項。如前所述,我不想移動自定義的ExpressionBuilder類,因爲它至少從.aspx文件開始工作。我還能嘗試什麼?

回答

0

我想通了。問題在於,出於某種原因,編譯器無法找到具有自定義ExpressionBuilder的程序集。什麼固定的問題是使用一個Partial Assembly Reference略有更多信息不僅僅是類名和命名空間在add標籤:

<system.web> 
<compilation debug="true"> 
    <!-- Skipping the 'assemblies' and 'buildProviders' areas --> 
    <expressionBuilders> 
     <add expressionPrefix="MyCustom" type="MyWebApplication.MyCustomExpressionBuilder, MyWebApplication" /> 
    </expressionBuilders> 
</compilation> 
<!-- other stuff --> 

換句話說,改變type屬性同時指定類名(帶名稱空間)和程序集的名稱。請注意,指定更多附加信息會導致不同的錯誤(即使是版本號,即使版本號正確)。

至於我怎麼知道的,解決這些問題的一個好建議是按照here的描述啓用日誌記錄。對於VS2008,你可以使用regedit到:

  1. 轉到HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0
  2. 創建一個名爲WebApplicationProjects如果不存在新的密鑰。然後,選擇它。
  3. 如果不存在,請創建一個名爲Debug的新密鑰。然後,選擇它。
  4. 添加一個名爲LogFile的新字符串。該值應該是VS2008具有寫入權限的路徑(因此,可能不是C的根目錄中的文件:)。請務必轉義任何反斜槓,例如C:\\PathICanWrite\\vslogfile.txt
  5. 添加一個名爲Enabled新的DWORD,並將其設置爲1。
  6. 添加一個名爲LogFieldGeneratorFailures新的DWORD,並將其設置爲1。
  7. 重啓VS2008。

當我查看日誌文件時,我能夠使用堆棧跟蹤來確定是否有裝配加載問題,現在看起來很明顯。在日誌中的消息給出了更前端解決的組件負載問題:

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

我發現,我需要重新啓動機器新的註冊表設置生效。然後,日誌中提供了其他程序集綁定信息。

相關問題