基于托管项目Targetframework的C#条件代码执行
Conditional code execution in C# based on Targetframework of hosting project
我有一个针对 .NET 标准 2.0 的 Base.dll
此 Base.dll 在其他 2 个项目中被引用:Framework.exe 和 Standard.exe
Framework.exe 是 .NET Framework 4.6.1 项目
Standard.exe 是一个 .NET Core 2.0 项目。
我的问题是:
如何在 Base.dll 中编写仅在 Base.dll 加载到 Standard.exe 中而不是在 Framework.exe
中加载的代码
This link详细介绍了基于目标框架的条件编译,但Base.dll的目标框架始终是netstandard 2.0。我只想在运行时确定托管进程的目标框架是什么。
IMO 正确 方法是在 csproj 级别通过多目标 - <TargetFrameworks>
等,以及 #if
(在 C# ) 或条件文件包含(再次在 csproj 中)。最终,您所描述的 正是 多目标的设计目的,除 "just use multi-targeting" 之外的任何解决方案都缺少一个巨大的功能 明确旨在 解决这些问题。构建机制有一个 "bait and switch" 层,它的工作是询问 "what is the target framework of the host application? ok, I'll give them {this version} of the dependency" - 这就是为什么传递依赖解析的工作被推迟到顶级应用程序构建,而不是库构建(库不由于我即将到达的原因,我无法可靠地了解主机 TFM。
然而,撇开这个不谈:
这里最大的问题是:.NET Standard 在运行时不存在,仅在编译时存在;我的意思是多方面的,包括 .NET Framework 可以承载 .NET Standard 的现实,所以当你问:
what is the target framework of the hosting process.
它将永远成为.NET Standard。如果这只是一个打字错误,而你指的是 .NET Core,那么你可能 相当安全 从 PlatformDetection.cs
:
借用这两行
using System.Runtime.InteropServices;
// ...
public static bool IsFullFramework => RuntimeInformation.FrameworkDescription.StartsWith(
".NET Framework", StringComparison.OrdinalIgnoreCase);
public static bool IsNetCore => RuntimeInformation.FrameworkDescription.StartsWith(
".NET Core", StringComparison.OrdinalIgnoreCase);
干净吗?不。是否有效:是。
我有一个针对 .NET 标准 2.0 的 Base.dll
此 Base.dll 在其他 2 个项目中被引用:Framework.exe 和 Standard.exe
Framework.exe 是 .NET Framework 4.6.1 项目
Standard.exe 是一个 .NET Core 2.0 项目。
我的问题是: 如何在 Base.dll 中编写仅在 Base.dll 加载到 Standard.exe 中而不是在 Framework.exe
中加载的代码This link详细介绍了基于目标框架的条件编译,但Base.dll的目标框架始终是netstandard 2.0。我只想在运行时确定托管进程的目标框架是什么。
IMO 正确 方法是在 csproj 级别通过多目标 - <TargetFrameworks>
等,以及 #if
(在 C# ) 或条件文件包含(再次在 csproj 中)。最终,您所描述的 正是 多目标的设计目的,除 "just use multi-targeting" 之外的任何解决方案都缺少一个巨大的功能 明确旨在 解决这些问题。构建机制有一个 "bait and switch" 层,它的工作是询问 "what is the target framework of the host application? ok, I'll give them {this version} of the dependency" - 这就是为什么传递依赖解析的工作被推迟到顶级应用程序构建,而不是库构建(库不由于我即将到达的原因,我无法可靠地了解主机 TFM。
然而,撇开这个不谈:
这里最大的问题是:.NET Standard 在运行时不存在,仅在编译时存在;我的意思是多方面的,包括 .NET Framework 可以承载 .NET Standard 的现实,所以当你问:
what is the target framework of the hosting process.
它将永远成为.NET Standard。如果这只是一个打字错误,而你指的是 .NET Core,那么你可能 相当安全 从 PlatformDetection.cs
:
using System.Runtime.InteropServices;
// ...
public static bool IsFullFramework => RuntimeInformation.FrameworkDescription.StartsWith(
".NET Framework", StringComparison.OrdinalIgnoreCase);
public static bool IsNetCore => RuntimeInformation.FrameworkDescription.StartsWith(
".NET Core", StringComparison.OrdinalIgnoreCase);
干净吗?不。是否有效:是。