簡體   English   中英

將我自己的C#項目配置添加到MSBuild / Visual Studio中

[英]Adding my own configuration for a C# project into MSBuild / Visual Studio

我可能會破解一些愚蠢的解決方案來解決我的問題,但是我很樂意做對並節省自己將來的麻煩。 我可以編寫簡單的.vcxproj文件,但它們通常最終會變得像初學者一樣,而且質量很差。

我有一個大型項目,我想用兩個選項來構建。 僅通過選擇一個特定的源文件(.cs),這兩個選項就彼此不同。 源目錄包含兩個源文件,每個文件都有自己的唯一文件名。 需要構建配置,然后在運行時初始化正確的文件。 可以分別構建兩個版本,但是開關必須干凈。 我並不在乎初始化函數是否具有相同的名稱或名稱。

我很想獲得有關如何制定該項目的vcxproj文件的建議,因此我可以輕松地在構建項目的一個版本或另一個版本之間進行切換。

謝謝

使用MsBuild的Condition您可以基於諸如Configuration之類的屬性來啟用/禁用編譯。 這可能適合您的情況:假設您現在具有“ Debug”和“ Release”配置,則可以添加“ Debug_OptionB”和“ Release_OptionB”配置。 在項目文件中,創建一個基於boolean的屬性,如果配置包含'OptionB'字符串,則為true:

<PropertyGroup>
  <CompilingWithOptionB>$(Configuration.Contains('_OptionB'))</CompilingWithOptionB>
</PropertyGroup>

現在使用此屬性進行條件編譯:

<ClCompile Condition="'$(CompilingWithOptionB)'!='True'" Include="src_a.cpp" />
<ClCompile Condition="'$(CompilingWithOptionB)'=='True'" Include="src_b.cpp" />

如果要包含/排除多個源文件,則將它們放在一個單獨的ItemGroup中,然后再具有Condition,甚至放在單獨的屬性表中。

 I can write simple .vcxproj files, but they usually end up being quite beginner-like and poor quality

我建議不要自己編寫它們,而是讓VS為您創建它們,然后添加修改。 這更容易,並且可以確保與VS的集成保持完整。 尤其是,它使添加/刪除/訂購/檢查屬性表變得更加容易(您正在使用它們來設置通用配置選項,對嗎?)。

如果沒有充分的理由要包含/排除文件,請考慮將所有文件編譯為一組二進制文件,並使用功能切換或其他配置機制(例如DI容器配置)來啟用/禁用特定功能。

Stijn的答案提供了實現條件包括的良好步驟-具有基於配置名稱或更好的條件符號(例如“ DEBUG”)的Condition=.... ,並使用項目文件中的Condition=....屬性啟用/禁用單個項或組。

但是要做好准備,許多VS工具和插件對於有條件包含的代碼至少是無用的(有時會很困惑)。 在VS中測試這樣的代碼也將更加困難,因為您當時只能針對單一風格的二進制文件運行測試,從而可能會使其他文件集未經測試。

以下是我聽說過為什么希望使用可能的替代方法具有這種“選擇不同文件”行為的原因:

  • 具有“完整” /“有限”版本的軟件-這可能是這樣做的唯一真實原因。 請注意,C#/。Net通常不受逆向工程保護,反正通過復制完整版本來克服這種限制可能太容易了。 確保權衡測試/支持多個版本的復雜性
  • 僅調試代碼/跟蹤/ ...- #if和條件屬性可能覆蓋大多數情況,因此可以始終包含文件,並使用常規條件符號啟用/禁用代碼(甚至默認的DEBUG構建配置也足夠)。 所有跟蹤/日志庫都具有足夠的配置設置,因此不需要此類文件級排除
  • 包裝針對特定風味的庫-例如32/64位互操作。 這可以通過運行時包含的單獨程序集和/或精心設計的類(在運行時選擇正確的實現)來處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM