当前位置: 首页 > news >正文

.Net 知识杂记

记录平日中琐碎的.net 知识点。不定期更新

目标框架名称(TFM)

我们创建C#应用程序时,在项目的工程文件(*.csproj)中都有targetFramework标签,以表示项目使用的目标框架

各种版本的TFM

.NET Framework

.NET Standard

.NET5 及更高版本

UMP等

参考文档:针对 NuGet 的目标框架参考 | Microsoft Learn

如何创建多TFM的项目

首次创建项目时,建议创建 .NET Standard 类库,因为它提供了与最广泛使用项目的兼容性。 使用 .NET Standard 可以默认向 .NET 库添加跨平台支持。 但是,在某些情况下,可能还需要包含针对特定框架的代码。 本文介绍如何针对SDK样式的项目执行该操作。

对于 SDK 样式的项目,可以在项目文件中配置对多个目标框架(TFM)的支持,然后使用dotnet pack 或 msbuild /t:pack 创建包。

 请注意:.NET 和 .NET Standard 目标是为 .NET 库添加跨平台支持的最佳方式。

  • .NET Standard是一套 .NET API 规范,在所有 .NET 实现中推出。 以 .NET Standard 为目标可以生成受限于使用给定版本的 .NET Standard 中的 API 的库,这意味着实现该版本的 .NET Standard 的所有平台都可以使用它。
  • .NET 6-8 是 .NET 的实现。 每个版本是具有一组统一功能和 API 的单一产品,可用于 Windows 桌面应用和跨平台控制台应用、云服务和网站。
步骤
  1. 在 Visual Studio 中或使用 dotnet new classlib 创建新的 .NET Standard 类库。

    建议创建 .NET Standard 类库以获得最佳兼容性。

  2. 编辑 .csproj 文件以支持目标框架。 例如,更改

    <TargetFramework>netstandard2.0</TargetFramework>

    更改为:

    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>

    确保将 XML 元素从单数更改为复数(将“s”添加到开始和结束标记)。

  3. 如果你有任何仅在一个 TFM 中工作的代码,则可以使用 #if NET45 或 #if NETSTANDARD2_0 分隔与 TFM 相关的代码。 (有关详细信息,请参阅如何设定多目标。)例如,可以使用以下代码

public string Platform {get {
#if NET45return ".NET Framework"
#elif NETSTANDARD2_0return ".NET Standard"
#else
#error This code block does not match csproj TargetFrameworks list
#endif}
}

参考文章:项目文件中 NuGet 包的多目标 | Microsoft Learn

NuGet packages.config 文件参考 | Microsoft Learn

相关文章:

  • Flutter 使用 AndroidStudio 给(Android 安卓)进行签名方法
  • 【2024系统架构设计】案例分析- 4 嵌入式
  • 《HelloGitHub》第 96 期
  • docker centos7离线安装ElasticSearch单机版
  • FastAPI+React全栈开发08 安装MongoDB
  • 【C++的奇迹之旅】C++关键字命名空间使用的三种方式C++输入输出命名空间std的使用惯例
  • Discourse 用户可以自己修改用户名吗
  • 后端常问面经之Java基础
  • 【unity】如何汉化unity Hub
  • 【React】React表单组件
  • Android裁剪图片为波浪形或者曲线形的ImageView
  • C++就业方向
  • Vue——案例01(查询用户)
  • c语言中动态内存管理
  • go中函数与方法的区别与go中关于面向对象理解
  • python3.6+scrapy+mysql 爬虫实战
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • DataBase in Android
  • httpie使用详解
  • JSDuck 与 AngularJS 融合技巧
  • PermissionScope Swift4 兼容问题
  • PHP的Ev教程三(Periodic watcher)
  • React中的“虫洞”——Context
  • select2 取值 遍历 设置默认值
  • 半理解系列--Promise的进化史
  • 汉诺塔算法
  • 码农张的Bug人生 - 见面之礼
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 微服务入门【系列视频课程】
  • 我从编程教室毕业
  • 容器镜像
  • 如何在招聘中考核.NET架构师
  • ​queue --- 一个同步的队列类​
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (6)设计一个TimeMap
  • (C++20) consteval立即函数
  • (附源码)php投票系统 毕业设计 121500
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)德国人的记事本
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ./configure,make,make install的作用(转)
  • ./和../以及/和~之间的区别
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET大文件上传知识整理
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [《百万宝贝》观后]To be or not to be?
  • [C]编译和预处理详解
  • [C++]二叉搜索树