我有一个.NET库(Products.SDK
),需要使它与.NET Framework 4.5和.NET Standard 1.4兼容。
(稍后我还将从这个库中创建一个nuget包)
我的问题是:
如何在这个库中编写代码?考虑到两个框架都使用不同的库/依赖项?
在同一个解决方案下,我会有两个独立的项目吗?
产品.sdk.sln
产品.sdk.netframework
products.sdk.netstandard标准
我是否只有一个项目,并且使用#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更好,但我不确定这是否正确。
附言:
我在
.csproj
文件中指定了目标框架 <PropertyGroup>
<TargetFrameworks>netstandard1.4;net45</TargetFrameworks>
</PropertyGroup>
最佳答案
您使用选项二-但只在您真正需要的地方使用#if
。您给出的示例在两个分支中都有相同的代码。
我的Noda Time项目正是采用了这种方法,因此我们很少遇到问题。
在可能的情况下,使两个平台的代码的公共api相同,只有实现细节不同。特别是,如果您确实需要只在一个平台上公开api的某些部分,我希望它只适用于net45
。如果你的结局是这样的:
公共A级-仅在Net45上
公共B级-仅在NetStandard上
公共C类-两者
如果有多个其他项目依赖于此,那么您将在以后遇到重大问题。假设project x以netstandard1.4为目标,使用b,然后project y以net45为目标,使用a-然后运行在.net 4.7上的应用程序z,这取决于x和y都会有问题。
完全避免使用条件代码是绝对值得的。在许多情况下,您可能会发现,虽然有一段稍微简单的代码可以在net45上工作,但仍然有一些代码可以在netstandard和net45上工作。(思考浮现在脑海中,在netstandard上使用TypeInfo
,在net45中使用Type
。不过,您可以在这两种情况下都使用TypeInfo
。)