创建库目标.Net Framework 4.5和.Net Standard

时间:2017-08-22 07:57:52

标签: c# .net asp.net-core .net-core .net-standard

我有一个.NET库(Products.SDK),我需要使它与.NET Framework 4.5和.NET Standard 1.4兼容。

(稍后我也会在这个库中创建一个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
    }
    
  3. 如果选项#1正确,我如何确保使用相同的名称/命名空间(Products.SDK)编译两个项目

    我认为选项#2更好,但我不确定这是正确的方法。

    PS:

    我在.csproj文件

    中指定了目标框架
      <PropertyGroup>
        <TargetFrameworks>netstandard1.4;net45</TargetFrameworks>
      </PropertyGroup>
    

1 个答案:

答案 0 :(得分:8)

您使用选项二 - 但仅在您真正需要的地方使用#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。)< / p>