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

4
我有一个.NET库(Products.SDK),我需要使其与.NET Framework 4.5和.NET Standard 1.4兼容。
(稍后我还将创建一个NuGet包)
我的问题是:
如何编写此库中的代码?考虑到两个框架使用不同的库/依赖项?
  1. Will i have two separate projects under the same solution?

    Products.SDK.sln

    • Products.SDK.NetFramework
    • Products.SDK.NetStandard
  2. Will i have only one project, and use #if preprocessor directives do define different classes inside the library?

    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>
1个回答

8
你使用了第二种选项——但只在确实需要的地方使用#if。你给出的例子两个分支中的代码是相同的。
我的Noda Time项目正是采用了这种方法,我们几乎没有因此遇到什么问题。
在可能的情况下,使你的代码公共API在两个平台上保持一致,只有实现细节不同。特别是,如果你确实需要仅在一个平台上暴露API的某些部分,我希望它仅适用于net45。如果你最终得到像这样的东西:
  • public class A - 仅在 net45 上
  • public class B - 仅在 netstandard 上
  • public class C - 两者都有
那么,如果你有多个其他项目依赖于此,则以后会遇到重大问题,假设项目 X 目标为 netstandard1.4 并使用 B,然后项目 Y 目标为 net45 并使用 A——然后在 .NET 4.7 上运行并依赖于 X 和 Y 的应用程序 Z 将会遇到问题。

尽可能避免使用条件代码绝对是值得尝试的。在许多情况下,您可能会发现,虽然有一个稍微简单一些的代码片段可以在仅限于net45上工作,但仍然有代码可以同时在netstandard和net45上工作。(Reflection显然是其中之一,在这种情况下,您将希望在netstandard上使用TypeInfo,而在net45上则可以直接使用Type。不过,您都可以在两者上使用TypeInfo。)


正是我所需要的,谢谢。祝贺你的职业生涯! - Catalin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接