2009-05-19 73 views
2

C#,.NET 2.0MSBuild失敗,但建設裏面的Visual Studio工作正常

我有一個解決方案,其他2個項目(用作庫引用)的ASP.NET網站。當我在Visual Studio中構建(調試或發佈)時,一切正常。但是,使用MSBuild構建失敗。

這個版本一直在工作(它實際上是通過一個nAnt任務調用的)。唯一改變的是我有一個新的用戶控件,其Type I在我的代碼中引用。

違規代碼在我的ASPX代碼後面。 MessageAlert是用戶控件:

MessageAlert userControl = this.LoadControl("~/UserControls/MessageAlert.ascx") as MessageAlert; 
     userControl.UserMessage = message; 
     this.UserMessages.Controls.Add(userControl); 

爲了讓Visual Studio來識別型「MessageAlert」我必須:在@Control標記

1)設定該類=「MessageAlert」頂部用戶控制的(因爲使用自動生成的UserControls_MessageAlert沒有任何工作)

2)註冊在我的ASPX的標記用戶控件,使用@Register

3)添加「使用ASP 「到我的代碼頂部

經過這些步驟之後,我可以在Visual Studio的代碼隱藏中成功引用MessageAlert類型。但是從MSBuild中我得到「無法找到類型或名稱空間名稱'MessageAlert'(您是否遺漏了使用指令或程序集引用?)」

MSBuild的執行非常簡單 - 它指出了非常類似的解決方案文件並將配置屬性設置爲釋放。

看來,根據我在Visual Studio中獲得MessageAlert類型引用所經歷的步驟數量,MSBuild過程中缺少某些內容。但是什麼? Visual Studio實際上不是在幕後調用MSBuild?

有沒有更好的方法來引用ASPX後面的代碼中的UserControl類型?

編輯:爲了澄清,MessageAlert用戶控件是而不是在其他引用程序集/項目。我提到他們是因爲和網站一起組成了Solution文件,這個文件和MS Build一樣是由同一個sln文件構成的。

+0

是在 「其他」 引用的項目之一messageAlert控制?你通常不能這樣做,但有解決方法。 – DancesWithBamboo 2009-05-19 23:51:27

+0

你在一個網站「項目」中使用這個嗎?如果是這樣,他們本身並不是真正意義上的*構建*。這也可能是你所看到的「UserControls_MessageAlert」的原因。 – 2009-05-20 01:27:55

回答

0

這似乎是您的解決方案中的HintPath問題。如果將引用的程序集作爲鏈接項目項目(以及項目引用)添加到項目中,MSBuild將優先使用鏈接程序集,而不是HintPath甚至AssemblyFolders。

另一種方法是將任何名稱的密鑰添加到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio_YourVersion_ \ AssemblyFolders中,並將其REG_SZ類型的(默認)值設置爲裝配的路徑。

2

我也有這個問題,正如你上面所描述的。

我不知道爲什麼這是最終目標,決定嘗試以下成功。

更改用戶控件的類名稱 - 實際的類名稱不是aspx文件中的類名稱。

所以在你的榜樣更改類名來MessageAlert(從UserControls_MessageAlert)在ASPX也改變這一在繼承

希望這可以幫助別人

0

嘗試從您的頁面刪除「使用ASP」節並確保@Control指令的「ClassName」屬性實際上匹配類的名稱。我們將ClassName值設置爲「FilterElement」,而實際的類名稱爲「Controls_FilterElement」。

因此,簡言之:

  • 在.ascx.vb並在的.ascx的@Control指令的繼承財產驗證您的類名。例如Inherits="FilterElement"
  • 將「ClassName」屬性添加到具有相同值的@Control指令中,例如, ClassName="FilterElement"
  • 在引用頁面/控件上添加「引用」元素。例如

    <%@ Reference Control="~/Controls/FilterElement.ascx" %>

  • 在後面的代碼,請參閱類直接。 不要使用ASP命名空間(這似乎是msbuild導致什麼困難的原因)。例如(在VB)

    Dim ctrlElement As FilterElement = CType(LoadControl("~/controls/filterelement.ascx"), FilterElement)

相關問題