Cat*_*lin 4 .net c# .net-core asp.net-core .net-standard
我有一个.NET库(Products.SDK),我需要使它与.NET Framework 4.5和.NET Standard 1.4兼容.
(稍后我将在这个库中创建一个NuGet包)
我的问题是:
我如何在这个库中编写代码?考虑到两个框架都使用不同的库/依赖项?
我会在同一解决方案下有两个独立的项目吗?
Products.SDK.sln
我只有一个项目,并使用#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
}
Run Code Online (Sandbox Code Playgroud)如果选项#1正确,我如何确保使用相同的名称/命名空间(Products.SDK)编译两个项目
我认为选项#2更好,但我不确定这是正确的方法.
PS:
我在.csproj文件中指定了目标框架
<PropertyGroup>
<TargetFrameworks>netstandard1.4;net45</TargetFrameworks>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
您使用选项二 - 但仅#if在您真正需要它的地方使用.您给出的示例在两个分支中都具有相同的代码.
我的Noda Time项目采用了这种方法,因此我们遇到的问题非常少.
尽可能使两个平台的代码的公共API相同,只有实现细节不同.特别是,如果您确实需要在一个平台上公开API的某些部分,我希望它只适用于net45.如果你最终得到这样的东西:
如果你有多个其他项目,那么你最后会遇到重大问题.假设项目X面向netstandard1.4并使用B,则项目Y目标为net45并使用A - 然后在.NET 4.7上运行的应用程序Z并且取决于X和Y将会出现问题.
绝对值得尝试完全避免条件代码.在许多情况下,您可能会发现虽然只有一些稍微简单的代码可以在net45上运行,但仍有代码可以在netstandard 和 net45上运行.(反思出现在你想要TypeInfo在netstandard 上使用的地方,你可以Type在net45中使用的地方.TypeInfo虽然你可以在两者中使用.)