创建针对 .Net Framework 4.5 和 .Net Standard 的库
Create library targeting .Net Framework 4.5 and .Net Standard
我有一个 .NET 库 (Products.SDK
),我需要使其与 .NET Framework 4.5 和 .NET Standard 1.4 兼容。
(稍后我也会从这个库中创建一个 NuGet 包)
我的问题是:
如何在这个库中编写代码?考虑到两个框架都使用不同的库/依赖项?
我会在同一个解决方案下有两个独立的项目吗?
Products.SDK.sln
- Products.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 更好,但我不确定这是正确的方法。
PS:
我在 .csproj
文件中指定目标框架
<PropertyGroup>
<TargetFrameworks>netstandard1.4;net45</TargetFrameworks>
</PropertyGroup>
您使用选项二 - 但只在您真正需要的地方使用 #if
。您给出的示例在两个分支中都有相同的代码。
我的 Noda Time 项目正是采用这种方法,因此我们遇到的问题很少。
在可能的情况下,使两个平台的代码 public API 相同,只有实现细节不同。特别是,如果您 需要仅在一个平台上公开 API 的某些部分,我希望它只针对 net45
。如果你最终得到这样的结果:
- public class A - 仅限 net45
- public class B - 仅适用于网络标准
- public class C - 两者
如果您有多个 other 项目依赖于此,那么您以后将遇到重大问题。假设项目 X 以 netstandard1.4 为目标并使用 B,然后项目 Y 以 net45 为目标并使用 A - 然后是 .NET 4.7 上的应用程序 Z 运行 并且取决于 X 和 Y 都会有问题。
绝对值得尝试完全避免条件代码。在许多情况下,您可能会发现虽然有一段稍微简单的代码可以只在 net45 上运行,但仍然有一些代码可以同时在 netstandard 和 net45 上运行。 (回想起来,你想在 netstandard 上使用 TypeInfo
,在 net45 中你可以使用 Type
的地方。你可以在两者中使用 TypeInfo
。)
我有一个 .NET 库 (Products.SDK
),我需要使其与 .NET Framework 4.5 和 .NET Standard 1.4 兼容。
(稍后我也会从这个库中创建一个 NuGet 包)
我的问题是:
如何在这个库中编写代码?考虑到两个框架都使用不同的库/依赖项?
我会在同一个解决方案下有两个独立的项目吗?
Products.SDK.sln
- Products.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 更好,但我不确定这是正确的方法。
PS:
我在 .csproj
文件中指定目标框架
<PropertyGroup>
<TargetFrameworks>netstandard1.4;net45</TargetFrameworks>
</PropertyGroup>
您使用选项二 - 但只在您真正需要的地方使用 #if
。您给出的示例在两个分支中都有相同的代码。
我的 Noda Time 项目正是采用这种方法,因此我们遇到的问题很少。
在可能的情况下,使两个平台的代码 public API 相同,只有实现细节不同。特别是,如果您 需要仅在一个平台上公开 API 的某些部分,我希望它只针对 net45
。如果你最终得到这样的结果:
- public class A - 仅限 net45
- public class B - 仅适用于网络标准
- public class C - 两者
如果您有多个 other 项目依赖于此,那么您以后将遇到重大问题。假设项目 X 以 netstandard1.4 为目标并使用 B,然后项目 Y 以 net45 为目标并使用 A - 然后是 .NET 4.7 上的应用程序 Z 运行 并且取决于 X 和 Y 都会有问题。
绝对值得尝试完全避免条件代码。在许多情况下,您可能会发现虽然有一段稍微简单的代码可以只在 net45 上运行,但仍然有一些代码可以同时在 netstandard 和 net45 上运行。 (回想起来,你想在 netstandard 上使用 TypeInfo
,在 net45 中你可以使用 Type
的地方。你可以在两者中使用 TypeInfo
。)