本文是 手把手教你写 Roslyn 修改编译 的文章,在阅读本文之前,希望已经知道了大多数关于 msbuild 的知识
微软发布 .NET Standard 2.0 已经有一段时间了, 根据 .NET Standard 2.0 支持版本的文档, Mono 5.4 是支持 .NET Standard 2.0 的, 对于 .NET Standard 2.0 应用的开发的介绍, 几乎全部都是在 Windows 系统下使用 Visual Studio 2017 进行的, 而在 Linux 或 macOS 系统下使用 Mono 的介绍缺却少之又少, 本文就一一个简单的控制台应用为例, 介绍一下如何在 Mono 下如何开发 .NET Standard 2.0 应用。
本篇主要讨论.NET Core应用程序项目结构的主题,重点探索.NET Core应用程序的多平台编译问题,这里指的多平台是指.NET Framework、.NET Core App、.NET Standard、Mono、UWP等多平台的条件编译、项目(包)引用、编译符号等问题。
.NET 5+(包括 .NET Core 版本)支持使用配置文件和环境变量在运行时配置 .NET 应用程序的行为。如果出现以下情况,则运行时配置是一个不错的选择:
在 MSBuild 中有一些特殊字符,如 $ @ % ' 等,本文介绍他们的含义,如何使用他们,以及你真的需要这些字符的时候如何编写他们。
在任何一种编程语言中,做基本的数学运算都是非常容易的事情。不过,不知道 .NET 项目的项目文件 csproj 文件中进行数学运算就不像一般的编程语言那样直观了,毕竟这不是一门语言,而只是一种项目文件格式而已。
.NET/C# 程序从 Main 函数开始执行,基本上各种书籍资料都是这么写的。不过,我们可以写多个 Main 函数,然后在项目文件中设置应该选择哪一个 Main 函数。
在写项目文件的时候,需要根据不同的条件定义或执行不同的代码,有一些比较常使用的判断,本文收藏起来,方便大家找
我之前的博客中有介绍如何在项目中生成额外的代码,也有介绍制作一个生成代码的 NuGet 包。而本文是在此基础上更进一步,可以让生成代码变成实时的;更准确的说,是在保存文件时即生成代码,而无需完整编译一次项目。
如果考虑在你的某个项目中安插一个专门用来做编译的项目,这个项目要求最先编译,那么你会考虑用什么方法呢?
发布于 2018-06-20 05:17 更新于 2018-07-02 12:49
在写 msbuild 的预编译逻辑,如果想要拿到项目安装的 NuGet 库和版本,可以通过获取 PackageReference 的方法获取
以前的项目格式使用的是 csproj 的格式,但是 .net core 支持使用 project.json 格式的项目文件,后来还是决定不使用这个格式。 VS2017 的项目格式更好读、更简单而且减少了 git 冲突。 本文来告诉大家如何从 VS2015 和以前的项目格式修改为 VS2017 项目格式。
.NET 是一个免费的开源开发平台,用于构建多种应用,例如: Web 应用程序、Web API 和微服务 云中的无服务器功能 云原生应用 移动应用 桌面应用程序 视窗 WPF Windows 窗体 通用 Windows 平台 (UWP) 游戏 物联网 (IoT) 机器学习 控制台应用程序 视窗服务 使用类库在不同的应用程序和应用程序类型之间共享功能。 使用 .NET,无论您正在构建哪种类型的应用程序,您的代码和项目文件的外观和感觉都相同。您可以使用每个应用程序访问相同的运行时、API 和语言功能。 跨平台 您可以为许多操作系统创建 .NET 应用程序,包括: 视窗 苹果系统 Linux 安卓 IOS 操作系统 手表操作系统 支持的处理器架构包括: x64 x86 ARM32 ARM64 .NET 允许您使用特定于平台的功能,例如操作系统 API。示例是 Windows 上的 Windows 窗体和 WPF,以及从 Xamarin 到每个移动平台的本机绑定。 有关更多信息,请参阅支持的操作系统生命周期策略和.NET RID 目录。 开源 .NET 是开源的,使用MIT 和 Apache 2 许可证。.NET 是.NET 基金会的一个项目。 有关更多信息,请参阅GitHub.com 上的项目存储库列表。 支持 Microsoft 在 Windows、macOS 和 Linux 上支持 .NET。它会在每个月的第二个星期二定期更新以确保安全性和质量。 Microsoft 的 .NET 二进制发行版在 Azure 中由 Microsoft 维护的服务器上构建和测试,并遵循 Microsoft 工程和安全实践。 Red Hat在 Red Hat Enterprise Linux (RHEL) 上支持 .NET。Red Hat 和 Microsoft 合作确保 .NET Core 在 RHEL 上运行良好。 Tizen 支持Tizen 平台上的.NET。 有关详细信息,请参阅.NET Core 和 .NET 5 的版本和支持。 工具和生产力 .NET 为您提供了多种语言、集成开发环境 (IDE) 和其他工具的选择。 编程语言 .NET 支持三种编程语言: C# C#(发音为“See Sharp”)是一种现代的、面向对象的、类型安全的编程语言。C# 起源于 C 语言家族,C、C++、Java 和 JavaScript 程序员很快就会熟悉 C#。 F# F# 语言支持函数式、面向对象和命令式编程模型。 视觉基础 在 .NET 语言中,Visual Basic 的语法是最接近普通人类语言的,这使得它更容易学习。与微软正在积极开发新功能的 C# 和 F# 不同,Visual Basic 语言是稳定的。Web 应用不支持 Visual Basic,但 Web API 支持它。 以下是 .NET 语言支持的一些功能: 类型安全 类型推断 - C#、F#、Visual Basic 通用类型 代表 拉姆达 活动 例外 属性 异步代码 并行编程 代码分析器 集成开发环境 .NET 的集成开发环境包括: 视觉工作室 仅在 Windows 上运行。具有广泛的内置功能,旨在与 .NET 一起使用。社区版对学生、开源贡献者和个人免费。 视觉工作室代码 在 Windows、macOS 和 Linux 上运行。免费和开源。扩展可用于使用 .NET 语言。 适用于 Mac 的 Visual Studio 仅在 macOS 上运行。用于为 iOS、Android 和 Web 开发 .NET 应用程序和游戏。 GitHub 代码空间 在线 Visual Studio Code 环境,目前处于测试阶段。 SDK 和运行时 在.NET SDK是一套库和工具的开发和运行.NET应用程序的。 当你下载.NET,您可以选择SDK或运行时,如.NET运行时或ASP.NET核心运行时。在要准备运行 .NET 应用程序的计算机上安装运行时。在要用于开发的机器上安装 SDK。当您下载 SDK 时,您会自动获得运行时。 SDK 下载包括以下组件: 在.NET CLI。可用于本地开发和持续集成脚本的命令行工具。 该dotnet 驱动程序。运行依赖于框架的应用程序的 CLI 命令。 在罗斯林和F#编程语言编译器。 该MSBuild的生成引擎。 在.NET运行库。提供类型系统、程序集加载、垃圾收集器、本地互操作和其他基本服务。 运行时库。提供原始数据类型和基本实用程序。 ASP.NET Core 运行时。为连接互联网的应用程序提供基本服务,例如 Web 应用程序、IoT 应用程序和移动后端。 桌面运行时。为 Windows 桌面应用程序提供基本服务,包括 Windows 窗体和 WPF。 运行时下载包括以下组件: (可选)
当 A 项目引用 B 项目,那么使用 Visual Studio 或者 MSBuild 编译 A 项目之前就会确保 B 项目已经编译完毕。通常我们指定这种引用是因为 A 项目确实在运行期间需要 B 项目生成的程序集。
.NET工具链在最新的Preview3版本中,引入了新的MSBuild项目系统,项目文件又回归了.csproj的XML文件来管理,项目文件、包引用、程序集引用、.NET Core工具集、发布内容定义等内容。本文主要将主要讨论,如何在新的项目系统中(.csproj)发布可执行文件。我们都知道在之前的版本中,项目文件是通过project.json文件来管理项目和包引用的,那么通过删除 dependencies->Microsoft.NETCore.App-> "type": "platform" 子节点,并定义runtimes节点,来发布可执行文件(想了解的朋友可以阅读这篇文章) 。
在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下新的项目配置文件中的节点配置,这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程的节点配置。做过完整迁移新项目配置文件的朋友,肯定会觉得新的项目配置文件Msbuild的配置太扯了,虽然能直接编辑项目文件,但整个配置文件中没有了像project.json中的智能提示,当你在打开文件后你就会发现以前很轻松能写出来的json配置,现在已经什么都写不出来了,而且也没有文档可以参考,一般的情况下,往往开发人员就会关掉项目文件,打开NuGet管理器来进行包引用,但是这真的够用吗?不是所有的配置都能用可视化的方法来完成。
发布于 2018-05-12 01:09 更新于 2018-09-01 00:16
最近我把很多项目都使用了 VisualStudio 2017 新项目格式,在使用的时候发现一些比较好用的功能。 本文告诉大家如何使用 VisualStudio 2017 项目格式自动生成版本号
在.NET Standard/.NET Core技术出现之前,编写一个类库项目(暂且称为基础通用类库PA)且需要支持不同 .NET Framework 版本,那么可行的办法就是创建多个不同版本的项目(暂且称为PB1、PB2、PB3 ... PBn)。PB1、PB2、PB3 ... PBn项目分别执行下面操作:【添加】--【现有项】--【添加为链接的方式】,将PA项目代码文件添加到各自项目中,如果代码不同,则需要使用#if #else #endif 等标签来判断 .NET Framework 版本。而在.NET Standard/.NET Core技术出现之后,可以通过配置SDK 样式项目中的目标框架来支持一套代码同时输出多版本类库。
.NET SDK 包含遥测功能,可在 .NET CLI 崩溃时收集使用情况数据和异常信息。 .NET CLI 附带 .NET SDK,是一组用于生成、测试和发布 .NET 应用的谓词。 请务必让 .NET 团队了解到工具使用情况,以便我们对其做出改进。 有关故障的信息可帮助团队解决问题并修复 bug。 收集的数据根据 Creative Commons Attribution 许可证以汇总形式发布。 范围 dotnet 具有两个功能:运行应用程序和执行 CLI 命令。 按以下格式使用 dotnet 来启动应用程序时,不会收集遥测数据: dotnet [path-to-app].dll 使用任何 .NET CLI 命令时,都会收集遥测数据,如: dotnet build dotnet pack dotnet run 如何选择退出 .NET SDK 遥测功能默认处于启用状态。 要选择退出遥测功能,请将 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量设置为 1 或 true。 如果安装成功,.NET SDK 安装程序也会发送一个遥测条目。 若要选择退出,请在安装 .NET SDK 之前设置 DOTNET_CLI_TELEMETRY_OPTOUT 环境变量。 重要 要在启动安装程序后选择退出,请执行以下操作:关闭安装程序,设置环境变量,然后使用该值集再次运行安装程序。 公开 首次运行其中一个 .NET CLI 命令(如 dotnet build)时,.NET SDK 显示以下类似文本。 文本可能会因运行的 SDK 版本而略有不同。 此“首次运行”体验是 Microsoft 通知用户有关数据收集信息的方式。 Telemetry --------- The .NET tools collect usage data in order to help us improve your experience. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell. Read more about .NET CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry 若要禁用此消息和 .NET 欢迎消息,请将 DOTNET_NOLOGO 环境变量设置为 true。 请注意,此变量在遥测选择退出时不起作用。 数据点 遥测功能不收集用户名或电子邮件地址等个人数据。 也不会扫描代码,更不会提取项目级敏感数据,如名称、存储库或作者。 数据通过 Azure Monitor 技术安全地发送到 Microsoft 服务器,提供对保留数据的受限访问权限,并在严格的安全控制下从安全的 Azure 存储系统发布。 保护你的隐私对我们很重要。 如果你怀疑遥测在收集敏感数据,或认为处理数据的方式不安全或不恰当,请在 dotnet/sdk 存储库中记录问题或发送电子邮件至 dotnet@microsoft.com 以供我们展开调查。 遥测功能收集以下数据: SDK 版本 数据 全部 调用时间戳。 全部 调用的命令(例如,“build”),从 2.1 开始进行哈希处理。 全部 用于确定地理位置的三个八进制数 IP 地址。 全部 操作系统和版本。 全部 运行 SDK 的运行时 ID (RID)。 全部 .NET SDK 版本。 全部 遥测配置文件:一个可选值,仅在用户显式选择加入时可用,并在 Microsoft 内部使用。 >=2.0 命令参数和选项:收集若干参数和选项(非任意字符串)。 请参阅收集的选项。 从 2.1.300 后进行哈希处理。 >=2.0 SDK 是否在容器中运行。 >=2.0 目标框架(来自 TargetFramework 事件),从 2.1 开始进行哈希处理。 >=2.0 经过哈希处理的媒体访问控制 (MAC) 地址 (SHA256)。 >=2.0 经过哈希处理的当前工作目录。 >=2.0 安装成功报告,包含进行了哈希处理的安装程序 exe 文件名。 >=2.1.300 内核版本。 >=2.1.300 Libc 发行/版本。 >=3.0.100 是否已重定向输出(true 或 false)。 >=3.0.100 CLI/SDK 故障时的异常类型及其堆栈跟踪(发送的堆栈跟踪中仅包含 CLI/SDK 代码)。 有关详细信息,请参阅收集的 .NET CLI/SDK 故障异常遥测。 >=5.0.100 用于生成的经过哈希处理的 TargetFr
发布于 2018-05-22 07:07 更新于 2018-07-25 23:21
你可能听说过“一个 .NET”的格言:一个统一的平台,用于生成任何类型的应用程序。 .NET 5.0 SDK 包括 ASP.NET Core、Entity Framework Core、WinForms、WPF、Xamarin 和 ML.NET,并且随着时间的推移,将添加对更多平台的支持。 .NET 5.0 旨在提供一种无需推出不同 .NET 风格,但不会尝试完全抽象出基础操作系统 (OS) 的体验。 你将继续能够调用特定于平台的 API,例如 P/Invoke、WinRT 或适用于 iOS 和 Android 的 Xamarin 绑定。
有小伙伴希望在 .NET 代码中使用指针,操作非托管资源,于是可能使用到 unsafe fixed 关键字。但使用此关键字的前提是需要在项目中开启不安全代码。
本来我想说的是基于引用 msbuild 程序集来自己做一个编译器,但是想想好像本文做的,和造编译器没啥关系,咱自己调用 msbuild 的 API 而已。本文来告诉大家如何引用 msbuild 程序集,如何在自己的应用程序里面嵌入 msbuild 的构建代码,实现 dotnet build 的效果
本文告诉大家如何在 WPF 中应用上 UWP 的笔迹控件,从而实现性能超级高的笔迹应用的方法
当创建 .NET Core/Standard 2.0项目时,VS不会像.NET Framework项目一样自动生成AssemblyInfo.cs文件。
发布于 2018-06-30 05:55 更新于 2018-08-12 08:05
发布于 2018-01-15 16:04 更新于 2018-09-07 04:40
我之前写过一些改变 MSBuild 编译过程的一些博客,包括利用 Microsoft.NET.Sdk 中各种自带的 Task 来执行各种各样的编译任务。更复杂的任务难以直接利用自带的 Task 实现,需要自己写 Task。
发布于 2018-06-30 12:27 更新于 2018-08-12 08:05
我们可以给.NET Core应用定义版本号,但如何在程序运行时读取呢?有几种做法。
近期想对自己的项目增加自动编译并生成nuget包,网上资料不少。但总还有迷糊的时候。首先:此解决方案包含多种版本的项目,如:有编译必须是x86平台,以及还有传统的.net foramework项目,以及多版本的.net core项目等。找到通用的解决方案还是用了不少的时间。本文章就对此做下自我总结。望对同仁有所帮助。 一、遇到的问题,以及解决办法 1.1 不同平台的编译怎么办 .net可以将dll(或者说是项目)编译成x86、x64、anycpu 等至少三种平台代码。但如果用dotn
在项目文件的相同文件夹可以放一个 nuspec 用来告诉 VisualStudio 如何打包
As you know, the WriteLinesToFile will separate the item by semicolons. How can we use WriteLinesToF
本文将告诉大家如何修复 dotnet 项目里的多框架 TargetFrameworks 如果包含了当前系统无法支持的平台时,如何进行跳过。解决在 Linux 平台构建时提示 Mac Catalyst 不受支持而构建失败
使用 SDK Style 格式的 csproj 十分简化,但是实际上的构建过程需要用到超级多的逻辑,那么如何知道在 msbuild 所使用的构建过程有哪些,定义了那些属性。有那些 target 文件参与了这个项目构建 本文告诉大家一个方法,可以输出某个项目在 msbuild 中的完全使用到的 targets 和属性等
当我们在传统格式的 csproj 项目文件中安装 NuGet 包后,有时会在项目文件中发现空的 NuGetPackageImportStamp 节点。这个空的节点让我们这波强迫症患者觉得有点难以接受,关键是手工删除之后也没发现有什么副作用。
MSBuild 不愧是强大的编译器,它提供的扩展机制让你几乎可以编译任何类型的文件或项目;Roslyn 是全新编写的一套编译器,不过它保留了 MSBuild 的大部分机制;NuGet 是 .NET 生态系统中的包管理机制,被原生集成在新的 Microsoft.NET.Sdk 中。
我们有多种工具可以将程序集合并成为一个。打包成一个程序集可以避免分发程序的时候带上一堆依赖而出问题。
发布于 2018-07-04 13:29 更新于 2018-09-04 13:08
我在迁移一个古老的项目为 .NET 6 框架,但是 VS 提示 error NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则必须将目标平台设置为 Windows 平台。但是我不想让此项目绑定到 Windows 平台上,不在 TargetFramework 上修改为 net6.0-windows 框架
本文介绍如何在项目文件 csproj,或者 MSBuild 的其他文件(props、targets)中处理路径中的斜杠与反斜杠。
Razor Page Library 是ASP.NET Core 2.1引入的新类库项目,属于新特性之一,用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来,封装成RPL,以进行代码重用。 官方文档Create reusable UI using the Razor Class Library project in ASP.NET Core中,仅简单介绍了如何创建RPL,但要想开发出一个独立通用的RPL远远没有那么简单,容我娓娓道来。
dotnet core最低开发环境要求就是一个.NET SDK,在这里可以下载的到最新版本的SDK,各个平台都有.
当咱新建了一个 UNO 的基础库或被引用的项目时,可能采用的是默认的基础库或库项目创建方法,被引用的程序集没有带上 WinUI 的黑科技,导致构建提示 UNOB0002: Project XX contains a reference to Uno Platform but does not contain a WinAppSDK compatible target framework. 失败
本文告诉大家 Directory.Build.props 是什么有什么优点?如何使用 Directory.Build.props 文件定义编译
现在再使用 Visual Studio 创建新的 WPF 项目时,将默认引诱你使用 .NET 6(或者 5、.NET Core 3.1)框架和配套的新的 SDK 风格的项目文件(csproj)。
我昨天将 Mac 构建机器也升级到了 dontet 5 最新版。但是在升级之后,所有的 Xamarin 项目都在 Mac 版本的 VisualStudio 构建不通过,提示 error MSB4186: 静态方法调用语法无效。解决方法就是将 VisualStudio 更新到最新版本
发布于 2018-05-11 16:04 更新于 2018-09-01 00:07
领取专属 10元无门槛券
手把手带您无忧上云