2017-08-22 115 views
4

我有一個.NET庫(Products.SDK),我需要使它與.NET Framework 4.5和.NET Standard 1.4兼容。創建庫定位.Net Framework 4.5和.Net標準

(後來我還將創建一個NuGet包出這個庫)

我的問題是:

我如何把代碼寫在這個庫?考慮到這兩個框架使用不同的庫/依賴關係?

  1. 我在同一個解決方案下有兩個單獨的項目嗎?

    Products.SDK.sln

    • Products.SDK.NetFramework
    • Products.SDK.NetStandard
  2. 我就只有一個項目,並使用#if預處理指令都定義不同庫內的類?

    namespace Products.SDK 
    { 
        #if NETSTANDARD1_3 
         public class ProductsApi 
         { 
          public string ApiUrl { get; set; } 
         } 
        #else 
         public class ProductsApi 
         { 
          public string ApiUrl { get; set; } 
         } 
        #endif 
    } 
    

如果選項1是正確的,我如何確保這兩個項目得到使用相同的名稱/命名空間(Products.SDK

我認爲該選項#2是更好的編譯,但我不確定這是否正確。

PS:

我在.csproj文件

<PropertyGroup> 
    <TargetFrameworks>netstandard1.4;net45</TargetFrameworks> 
    </PropertyGroup> 

回答

7

您使用方案二指定目標框架 - 但只使用#if在地方,你真的需要它。你給的例子在兩個分支都有相同的代碼。

我的Noda Time項目完全採用這種方法,因此我們遇到的問題很少。

如有可能,請在兩個平臺上使代碼的公共API相同,只有實現細節不同。特別是,如果您需要在一個平臺上公開您的API的某些部分,我希望它只適用於net45。如果你最終的東西是這樣的:

  • 公共類A - 只在net45
  • 公共B類 - 只在netstandard
  • 公共C類 - 無論是

那麼你如果您有多個其他項目取決於此,最終會出現重大問題。假設項目X的目標是netstandard1.4並使用B,那麼項目Y的目標是net45並使用A - 那麼運行在.NET 4.7上的應用程序Z將根據X和Y而出現問題。

絕對值得嘗試以完全避免條件代碼。在很多情況下,你可能會發現雖然有一個稍微簡單的代碼可以在net45上運行,但仍然有代碼可以在netstandard net45上運行。 (反思彈簧,想要在netstandard上使用TypeInfo,在net45中你可以使用Type的地方,儘管你可以使用TypeInfo。)

+0

正是我需要的,謝謝。祝賀你的職業生涯! – Catalin

相關問題