c# - 基于托管项目Targetframework的C#条件代码执行
问题描述
我有一个针对 .NET 标准 2.0 的 Base.dll
此 Base.dll 在 2 个其他项目中被引用:Framework.exe 和 Standard.exe
Framework.exe 是一个 .NET 框架 4.6.1 项目
Standard.exe 是一个 .NET Core 2.0 项目。
我的问题是:如何在 Base.dll 中编写仅在将 Base.dll 加载到 Standard.exe 而不是在 Framework.exe 加载时才会执行的代码
该链接详细介绍了基于目标框架的条件编译,但 Base.dll 的目标框架始终为 netstandard 2.0。我只想在运行时确定托管进程的目标框架是什么。
解决方案
IMO 执行此操作的正确方法是在 csproj 级别通过多目标 -<TargetFrameworks>
等,并且#if
(在 C# 中)或条件文件包括(再次在 csproj 中)。最终,您所描述的正是多目标的设计目的,除了“仅使用多目标”之外的任何解决方案都错过了明确针对的巨大功能在解决这些问题。构建机制有一个“诱饵和切换”层,其工作是询问“主机应用程序的目标框架是什么?好的,我会给他们{this version}的依赖”——这就是为什么传递依赖解析被推迟到顶级应用程序构建,而不是库构建(由于我即将谈到的原因,库并不可靠地知道主机 TFM)。
但是,抛开这一点:
您最大的问题是:.NET Standard 在运行时不存在,仅在编译时存在;我的意思是多方面的,包括 .NET Framework 可以托管 .NET Standard 的现实,所以当你问:
托管过程的目标框架是什么。
它永远不会是 .NET 标准。如果这只是一个错字并且您的意思是.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);
干净吗?不。它会工作吗:是的。
推荐阅读
- java - 使用 XmlIo 在 apache 梁中读取 xml 文件
- java - 如何从HashMap中提取数据
在改造 2 中? - r - 从另一个数据框中的 a.character 列创建一个数据框,其中包含 R 中的元素列表
- javascript - 如何使用Javascript动态绘制网格框以对齐网格
- matlab - 如何连接电流测量?
- javascript - Angular RxJs Observable 流合并数据
- python - 使用带有多个组的 pandas 提取正则表达式
- php - 如何解析这种格式?
- android - Android 进度指示器在 for 循环中一次递增
- flutter - 颤振:异步等待