0

背景在設計師使用#if指令生成的代碼與Windows窗體條件編譯​​

我有一個C#Windows窗體應用程序包含一個Windows服務和用於配置系統設置以及通信的接口與服務。

期望的結果

我想構建解決方案的兩個版本 - 一個客戶版本與所有的Windows服務相關的代碼和表單元素,幷包含一切服務器版本。

該表單包含一個選項卡式控件,其中一個選項卡包含用於使用套接字與Windows服務進行接口的元素。我真正想要實現的是,對於完整構建,包含與服務相關的元素的選項卡被編譯,而對於條件構建,則排除相同的選項卡。

問題

在這個階段,我用#如果圍繞Windows服務相關的代碼指令。例如:

#if SERVERBUILD 
    //Code relating to Windows service that I do not want to compile 
    //for a client version. 
#endif 

在上述例子中,「SERVERBUILD」對應於構建配置,我可以通過配置管理器中選擇(相對於標準的「推出」構建選項)。

我遇到的問題是,有些代碼我已經把這個包#if指令的周圍在於在標題爲地區WinForm.Designer.cs文件「Windows窗體設計器生成的代碼」。

似乎正在發生的是,當我對某些表單屬性進行更改時,整個代碼區域似乎被刪除並重新生成,從而刪除了我添加的#if部分。

  • 我該說這個正確的方法嗎?
  • 有沒有辦法避免我失去了我在WinForm.Designer.cs代碼中所做更改的情況?

我真的很感謝任何有條件編譯和這類東西經驗的人的建議。

+1

您能否提供您的代碼的一般概述?什麼地方做了?我懷疑你將GUI從邏輯上解耦出來時存在一個主要問題。 – Femaref 2011-03-14 23:10:26

+0

不是解耦問題,因爲我不想控制GUI元素以外的代碼。我添加了一些關於我想要做什麼的更多細節。 – Span 2011-03-15 00:11:24

回答

1
/// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() { 

Nuff說。通過將代碼的形式構造解決您的問題:

public Form1() { 
     InitializeComponent(); 
#if !SERVERBUILD 
     panel1.Visible = false; 
#endif 
    } 

注意,使用面板是一個簡單的方法,使所有的都在不可見的控件。

1

你可以做的事情不多。表單設計人員將生成該代碼,並以蠻力的方式執行此操作,而不必考慮您的需求或您所做的更改。你不應該因爲這個而自動生成代碼。

您需要採取一種新方法,並找出如何在不改變自動編碼的情況下完成您所需要完成的任務,因爲這絕對是一種純粹的挫敗感。

+0

是的,我越看越看起來錯了。我猜想我能夠使用#if來編譯錯誤的路徑。感謝您的意見。 – Span 2011-03-15 00:09:21

2

#if方法的一個問題是,您可以快速開始陷入一種情況,在這種情況下,您有多個用於不同編譯的#if語句。很快就會很難判斷哪個代碼塊與哪個項目相關。

更好的解決方案是識別所有常見代碼並將它們保存在單獨的項目文件夾中,例如common /。然後你有服務器/下的特定服務代碼和客戶端/下的所有表單代碼。

所有常見的代碼將仍然存在於一個位置,您的服務器和客戶端變得更可讀。您不必再擔心客戶端只會影響服務器和相反的更改。加上適當的文件夾組織,你可以保持你的項目(抽象的概念,如客戶端/服務器),除了具體的實現(如表單)之外。

+0

感謝您的建議,這個應用程序已經慢慢發展了幾年,它最初並沒有計劃建立客戶端和服務器。我會盡力爲新的應用程序做到這一點。 – Span 2011-03-15 00:07:57

+0

起初這很難,毫無疑問。但長期收益要大得多。 – MadcapLaugher 2011-03-16 00:29:08