首页 > 解决方案 > 基于托管项目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。我只想在运行时确定托管进程的目标框架是什么。

标签: c#.net.net-standard-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);

干净吗?不。它会工作吗:是的。


推荐阅读