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

6

我有一个小型图书馆,目前支持.NET 2.0+。

我没有使用较新的框架版本的任何功能,因此保留2.0支持是很好的选择,但我也想针对.NET Core(或更准确地说,.NET Standard)进行定位。

我尝试将两个框架都添加到project.json中:

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

但是我的库需要在 .NET Standard 上运行的 NuGet 包(System.ReflectionMicrosoft.AspNetCore.WebUtilities)与 .NET 2.0 不兼容。
如何解决此问题,而不必维护两个几乎相同的完全独立的项目?

问题是,如果你想使用一个最低要求为4.5.1 / netstandard 1.3(=.NET Framework 4.6)的包,那么你需要.NET Framework 2.0支持吗?你想在遗留的ASP.NET 4上使用它吗?如果不是,如果有一个依赖于ASP.NET Core的依赖项,那么没有理由将其定位得那么低,因为ASP.NET Core不会在低于4.5或4.5.1的环境下运行。 - Tseng
2个回答

5

如果你依赖于Microsoft.AspNetCore.*包,那么你无法支持.NET Standard的最低版本,因为它需要.NET 4.5。

.NET 4.5是第一个包含System.Runtime的版本,而.NET Core也是基于此构建的。但是,仔细思考一下,这也是没有意义的。如果你需要在库中支持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 页面)。

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

1
你可以通过将代码放入共享项目中,然后创建一个针对 .Net 2.0 的类库和另一个针对 NetStandard 的类库来实现这一点。如果在其中一个平台上有某些东西不可用于另一个平台,您可以使用编译器指令为每个平台编写兼容的代码。

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