首页 文章

如何创建一个同时针对.NET 2.0和.NET Standard的库?

提问于
浏览
4

我有small library,目前支持.NET 2.0 .

我不使用后来框架版本的任何功能,所以保持2.0支持会很好,但我也希望以.NET Core(或更确切地说,.NET标准)为目标 .

我试图将两个框架添加到 project.json

"frameworks": {
  "net20": {},
  "netstandard1.6": {
    "imports": "dnxcore50"
  }
}

但是我的库需要在.NET Standard( System.ReflectionMicrosoft.AspNetCore.WebUtilities )上运行的NuGet包与.NET 2.0不兼容 .

如何在不使用几乎相同的代码维护两个完全独立的项目的情况下解决此问题?

2 回答

  • 1

    如果您依赖于 Microsoft.AspNetCore.* 软件包,那么您不能支持.NET标准的最低支持率为 absolute .

    .NET 4.5是包含.NET Core所基于的 System.Runtime 的第一个版本 . 但是当你仔细考虑它时,它也毫无意义 . 如果您需要在库中支持ASP.NET Core .

    如果您的库应该运行ASP.NET Core和ASP.NET 4(即MVC 5,WebApi 2),那么您将需要有条件地使用ASP.NET依赖项并使用 #if 预处理程序指令 .

    "frameworks": {
      "net20": {
        "dependencies": {
          "NameOf.AspNetLegacyPackage": "1.2.3"
        }
      },
      "netstandard1.3": {
        "dependencies": {
          "Microsoft.AspNetCore.WebUtilities" : "1.1.0"
        },
        "imports": "dnxcore50"
      }
    }
    

    我使用 netstandard1.3 这是 Microsoft.AspNetCore.WebUtilities 的最小值,但根据您的其他依赖关系,您可能需要更高或更低 .

    NameOf.AspNetLegacyPackage 是包的名称,它包含您需要的 Microsoft.AspNetCore.WebUtilities 相同的功能,但如果有的话,它适用于.NET Framework 2.0 . 如果不是,您必须将其删除并自行编写替换功能 .

    然后在你的代码中使用

    #if NETSTANDARD1_3
        // Code or APIs which is only available in netstandard1.3/net4.6 
        // this includes the Microsoft.AspNetCore.WebUtillities
    #else
        // Use code or API which runs under .NET Framework 2.0
    #endif
    

    或者,如果您要放弃.NET Framework 2.0支持并转到4.5.1,您可以继续使用 Microsoft.AspNetCore.WebUtillities (请参阅NuGet page以获取依赖关系)

    "dependencies": {
      "Microsoft.AspNetCore.WebUtilities" : "1.1.0"
    },
    "frameworks": {
      "net451": {
      },
      "netstandard1.3": {
        "imports": "dnxcore50"
      }
    }
    
  • 4

    您可以将代码放入Shared项目,然后创建一个以.Net 2.0为目标的类库,以及另一个以NetStandard为目标的类库项目 . 如果2.0或Netstandard中的某些内容在其他平台中不可用,则可以使用编译器指令为每个平台编写兼容代码 .

相关问题