创建针对 .Net Framework 4.5 和 .Net Standard 的库

Create library targeting .Net Framework 4.5 and .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
    }
    

如果选项 #1 正确,我如何确保使用相同的名称/命名空间编译两个项目 (Products.SDK)

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

PS:

我在 .csproj 文件中指定目标框架

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

您使用选项二 - 但只在您真正需要的地方使用 #if。您给出的示例在两个分支中都有相同的代码。

我的 Noda Time 项目正是采用这种方法,因此我们遇到的问题很少。

在可能的情况下,使两个平台的代码 public API 相同,只有实现细节不同。特别是,如果您 需要仅在一个平台上公开 API 的某些部分,我希望它只针对 net45。如果你最终得到这样的结果:

  • public class A - 仅限 net45
  • public class B - 仅适用于网络标准
  • public class C - 两者

如果您有多个 other 项目依赖于此,那么您以后将遇到重大问题。假设项目 X 以 netstandard1.4 为目标并使用 B,然后项目 Y 以 net45 为目标并使用 A - 然后是 .NET 4.7 上的应用程序 Z 运行 并且取决于 X 和 Y 都会有问题。

绝对值得尝试完全避免条件代码。在许多情况下,您可能会发现虽然有一段稍微简单的代码可以只在 net45 上运行,但仍然有一些代码可以同时在 netstandard net45 上运行。 (回想起来,你想在 netstandard 上使用 TypeInfo,在 net45 中你可以使用 Type 的地方。你可以在两者中使用 TypeInfo。)