2017-08-22 82 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

相关问题