2012-07-23 37 views
4

我需要在我的應用程序中創建一些核心庫,這些庫將在.NET 3.5和.NET 4.0中提供。我很高興創建多個項目,創建所需的定義,並使用#ifdef來控制哪些代碼將其轉換爲哪個輸出組件。讓項目在多個.NET版本中保持同步

但是,我想知道的是,如果有一種方法來保持這些項目同步?當我在XNA下開發時,我有一個Windows版本和一個Windows Phone版本 - 並且XNA將一個屬性注入名爲XnaCrossPlatformGroupID的項目文件。它的作用是使Visual Studio自動確保在將文件添加到項目中時將其添加到相應的項目中。所以,例如,如果我將一個名爲Foo.cs的文件添加到我的項目的Windows副本中,則會將該文件添加到項目的Windows Phone副本中。

是否有任何方式複製Visual Studio中的一組正常項目的這種行爲?我不希望使用構建配置,因爲我希望能夠在一個步驟中編譯所有目標平臺,而無需藉助IDE之外的工具(比如TeamCity)。還是有另一種方法可以讓一個項目針對多個目標而構建,而無需使用20種不同的構建配置來解決該解決方案?

回答

7

我要做的就是:

  • 有一個「正規」的csproj,我使用的大部分我開發的,添加文件等 - 但是記住,真的所有文件「在」
  • 對於其他的csproj,使用類似:

    <ItemGroup> 
        <Compile Include="..\Foo\**\*.cs" /> 
    </ItemGroup> 
    

(即基本上是一樣的 「添加爲鏈接」,b而不需要在每個文件的基礎上完成)

這是一個遞歸包含所有* .cs文件,所以一切都在。沒有文件維護需要。


如果你想針對多種框架(而不是多個版本),那麼另一種選擇可能是:使用Portable Class Library。這是一個適用於多個框架的單個項目,,但僅限於您定位平臺的嚴格交叉功能。在VS2010中,這是一個附加功能;它默認包含在VS 11中。

+0

遞歸包含的東西很酷 - 但我看到的一個缺陷是,即使某些文件丟失了,您也無法在解決方案資源管理器中看到它(這使事情變得更容易)。 我也嘗試過可移植類庫 - 但它太嚴格了,並且在某些文件跨平臺更改時無濟於事。我也必須在Android和iOS上編譯我的代碼(使用MonoDroid和MonoTouch)。 – Ani 2012-07-23 20:43:34

+0

@ananthonline我一直在protobuf-net上使用遞歸事物4年;從來沒有導致問題:) – 2012-07-23 20:56:56

+0

我* *愛*。我曾閱讀過有關可移植類庫的信息 - 但可以使用它們來定位多個.NET Framework版本嗎?我必須承認我有點跛腳,並沒有嘗試過,因爲它看起來像是針對跨平臺而不是Framework版本的可移植性...... – 2012-07-23 20:57:22

0

我對跨平臺項目所做的工作是爲每個平臺設置不同的slns。

共享代碼位於一個共同的位置,並將「作爲鏈接」添加到正確的csproj中。這個csproj還包含任何平臺特定的文件。如果一個「公共代碼」文件需要基於當前平臺進行有條件的處理,您可以選擇將其替換爲兩個特定於平臺的文件,或者在其中放置一個#ifdef(取決於它有多少不同)。

請注意,您也可以將一個解決方案添加到Visual Studio中的另一個解決方案。這種「組合」解決方案可用於所有平臺的自動構建。

例子:https://github.com/ananthonline/graffiti

這對我的作品很大,因人而異。希望這可以幫助。

+0

這是否意味着您實際上必須將文件添加到項目a),然後將其添加爲項目b)的鏈接?因爲這幾乎是我試圖避免的場景...... – 2012-07-23 20:58:10

+0

我將它作爲手動鏈接添加到兩個項目中。由於我的文件數量不是很大,我可以做到這一點。如果文件數量在以後增加,我可能會考慮Marc Gravell的方法。 – Ani 2012-07-23 21:00:30

相關問題