首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包

一篇介绍写基于 MSBuild Task 的 dll,一篇介绍写任意的命令行工具,可以是用于 .NET Framework 的 exe,也可以是基于 .NET Core 的 dll,甚至可以是使用本机工具链编译的平台相关的各种格式的命令行工具...第二步:组织 NuGet 目录 刚刚生成的 NuGet 包还不能真正拿来用。事实上你也可以拿去安装,不过最终的效果只是加了一个毫无作用的引用程序集而已(顺便还带来一堆垃圾的间接引用)。....dll,文档注释 .xml 和符号文件 .pdb 的 + lib/ // 用来放那些与平台相关的 .dll/.pdb/.pri 的 + runtimes/ // 任意种类的文件,在这个文件夹中的文件会在编译拷贝到输出目录...提示:一旦调试环境搭建好,你可能会遇到编译 Walterlv.NuGetTool 项目,发现 dll 被占用的情况,这时,打开任务管理器结束掉 msbuild.exe 进行即可。...如果在阅读这篇文章存在一些概念理解上的问题,或者不知道如何扩展本文的功能,可能需要阅读下我的另一些文章: 理解 C# 项目 csproj 文件格式的本质和编译流程 - 吕毅 项目文件中的已知属性(知道了这些

1.4K10

使用 Source Generator 在编译你的 .NET 项目自动生成代码

这是一个在本机内进行进程间通信的库,在你拥有一个 IPC 接口和对应的实现之后,本库还会自动帮你生成通过 IPC 代理访问的代码。...(Proxy); 为这个类生成对接类(Joint); 为这些类生成关系(AssemblyInfo); 将这些新生成的代码都加入到项目中进行编译; 如果中间出现未知异常,则用自己编写的 DiagnosticException...等打包发布后,就能出现本文一开始说的能生成代码的效果了。 调试代码生成器 代码生成器编写更复杂的时候,调试就成了一个问题。接下来我们说说如何调试代码生成器。...这样,编译此 dotnetCampus.Ipc.Test 项目,就会触发选择调试器的界面,你就能调试你的代码生成器了。...当然,除了用项目引用的方式,你还能直接引用最终的 dll: 1 2 3 <Analyzer Include="..\..

52030
您找到你想要的搜索结果了吗?
是的
没有找到

理解 C# 项目 csproj 文件格式的本质和编译流程

并说出其中每一行的含义 可以手工修改 csproj 文件,以实现你希望达到的高级功能(更高级的,可以开始写个工具自动完成这样的工作了) 理解新旧 csproj 文件的差异,不至于写工具解析和修改 csproj 文件的时候出现不兼容的错误...Targets 是一种非常强大的功能扩展方式,支持 msbuild 预定义的一些指令,支持命令行,甚至支持使用 C# 直接编写(当然编译成 dll 会更方便些),还支持这些的排列组合和顺序安排。...如果你希望看看 Microsoft.NET.Sdk 都引入了哪些文件,可以去本机安装的 msbuild 或 dotnet 的目录下查看。...当我使用 msbuild 编译,我的地址:C:\Program Files\dotnet\sdk\2.1.300\Sdks\Microsoft.NET.Sdk\build\。...在编译msbuild 或 Roslyn 还会重新做一遍上面的事情——毕竟这两个才是真正的编译器,可不是 Visual Studio 的一部分啊。随后,执行编译过程。

2.6K10

MSBuild 中的特殊字符($ @ % 等):含义、用法以及转义

---- 特殊字符 MSBuild 中有这些特殊字符: $ @ % ' ; ? * 含义和用法 $ 引用一个属性或者环境变量。...如何更精准地设置 C# / .NET Core 项目的输出路径?...(包括添加和删除各种前后缀) 在 csproj 文件中使用系统环境变量的值(示例将 dll 生成到 AppData 目录下) @ 引用一个集合。...(dll/NuGet/Project)的路径 在制作跨平台的 NuGet 工具包,如何将工具(exe/dll)的所有依赖一并放入包中 % 引用集合中某一个项的某个属性。...本文会经常更新,请阅读原文: https://blog.walterlv.com/post/msbuild-special-characters.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验

34920

MSBuild入门(续)

MSBuild基本概念(续) 在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见一些用法和概念做些补充。...主要有一下几方面: MSBuild特殊字符:MSBuild保留的一些字符,以及XML中的特殊字符处理。 MSBuild条件: Condition特性,作用类似于C#的if。...MSBuild特殊字符 一些字符在MSBuild中代表着特殊的上下文含义,如下: MSBuild的特殊字符[%引用元数据]、[$引用属性]、[@引用项]、['条件或其他表达式]、[;列表分隔符]、[?...MSBuild属性 上篇介绍到可以用$可以引用自定义的属性,除此之外亦可以引用系统的环境变量,如$(Path),以及 MSBuild保留属性(MSDN)。...MSBuild项 项大都是用来引入文件用的,而文件会有一些附加信息,比如版本,语言等,而这些附加信息在项目文件中是以项的子元素的出现的,称为项的元数据。

92390

如何创建一个基于命令行工具的跨平台的 NuGet 工具包

一篇介绍写基于 MSBuild Task 的 dll,一篇介绍写任意的命令行工具,可以是用于 .NET Framework 的 exe,也可以是基于 .NET Core 的 dll,甚至可以是使用本机工具链编译的平台相关的各种格式的命令行工具...事实上你也可以拿去安装,不过最终的效果只是加了一个毫无作用的引用程序集而已(事实上就是把你写的程序作为普通 dll 引用了)。....dll,文档注释 .xml 和符号文件 .pdb 的 + lib/ // 用来放那些与平台相关的 .dll/.pdb/.pri 的 + runtimes/ // 任意种类的文件,在这个文件夹中的文件会在编译拷贝到输出目录...; } } } 这样,在使用 msbuild 或者 dotnet build ,就会弹出一个调试器选择界面。 ?...如果在阅读这篇文章存在一些概念理解上的问题,或者不知道如何扩展本文的功能,可能需要阅读下我的另一些文章: 理解 C# 项目 csproj 文件格式的本质和编译流程 - 吕毅 项目文件中的已知属性(知道了这些

99320

从零开始学习 dotnet 编译过程和 Roslyn 源码分析

复制文件 - 林德熙 如何使用 MSBuild Target(Exec)中的控制台输出 - 吕毅 如何在 MSBuild Target(Exec)中报告编译错误和编译警告 - 吕毅 更高级的 Target...让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 - 吕毅 基于 Target 的一些应用: Roslyn 如何在 Target 引用 xaml 防止文件没有编译 -...文件啦) - 吕毅 可以使用 NuGet 做一些不是传统 dll 引用的功能: Roslyn 通过 nuget 统一管理信息 - 林德熙 Roslyn 通过 Nuget 管理公司配置 - 林德熙 现在...吕毅 在制作跨平台的 NuGet 工具包,如何将工具(exe/dll)的所有依赖一并放入包中 - 吕毅 NuGet 的坑很多,有些可以解,有些需要规避: 帮助官方 NuGet 解掉 Bug,制作绝对不会传递依赖的...NuGet 包 - 吕毅 MSBuild/Roslyn 和 NuGet 的 100 个坑 - 吕毅 Roslyn 通过 Nuget 引用源代码 在 VS 智能提示正常但是无法编译 - 林德熙 如果你的

27440

制作通过 NuGet 分发的源代码包,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)

,因为程序集数量太多对程序的启动性能有很大的影响: C# 程序集数量对软件启动性能的影响 - 林德熙 然而制作一个 NuGet 的坑很多,详见: MSBuild/Roslyn 和 NuGet 的 100...我们是通过项目中设置了属性 BuildOutputTargetFolder 让生成的文件跑到这里来的,目的是避免安装此 NuGet 包之后,引用了我们生成dll 文件。...在那篇博客中,我们解释到新生成的项目文件会使用 ReferencePath 替代其他方式收集到的引用,这就包含项目引用和 NuGet 包的引用。...当然这个编译错误出现在临时生成的程序集上。...ReferencePathTypeName,传入了字符串常量 ReferencePath,这是为了在生成临时项目文件使用正确的引用路径项的名称。

42840

.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖

这个程序引用了一个 NuGet 包 Ben.Demystifier。为此带来了三个额外的依赖。...- System.Reflection.Metadata.dll 而我们可以使用 ILMerge 将这些依赖和我们生成的主程序合并成一个程序集,这样分发程序的时候只需要一个程序集即可。...(注意到项目文件中我有额外引用一个其他的 NuGet 包 Ben.Demystifier,这是为了演示将依赖进行合并而添加的 NuGet 包,具体是什么都没有关系,我们只是在演示依赖的合并。)...需要注意 如果使用新的基于 Sdk 的项目文件,那么默认生成的 PDB 是 Portable PDB,但是 ILMerge 暂时不支持 Portable PDB,会在编译提示错误: 1 2 3 4 5...args) 目前,GitHub 上有 issue 在追踪此问题: Support for portable PDBs · Issue #11 · dotnet/ILMerge ---- 参考资料 [C#

1.7K30

OFFENSIVE LATERAL MOVEMENT 横向移动(译文)

当用户登录,系统通过将用户密码与安全数据库中存储的信息进行比较来验证用户密码。验证用户的凭证后,系统将生成访问令牌。代表该用户执行的每个进程都有此访问令牌的副本。...因此,当用户通过网络登录登录到远程系统,该用户的凭据将不会出现在远程系统上以执行进一步的身份验证。...MSBuild用于通过提供架构的XML文件来compile/build C# applications。...从攻击者的角度来看,这用于编译C#代码以生成恶意的二进制文件或有效负载,甚至直接从XML文件运行有效负载。MSBuild也可以通过SMB进行编译,如下语法所示。...当发生网络登录(类型3),会出现双跳问题,这意味着凭据实际上从未发送到远程主机。由于凭据没有发送到远程主机,因此远程主机无法向有效负载托管服务器进行身份验证。

4.1K10

.NET 简介

编程语言 .NET 支持三种编程语言: C# C#(发音为“See Sharp”)是一种现代的、面向对象的、类型安全的编程语言。...该MSBuild生成引擎。 在.NET运行库。提供类型系统、程序集加载、垃圾收集器、本地互操作和其他基本服务。 运行时库。提供原始数据类型和基本实用程序。 ASP.NET Core 运行时。...将应用程序发布为依赖于框架的应用程序会生成一个可执行文件和二进制文件(.dll文件),其中仅包含应用程序本身及其依赖项。应用程序的用户必须单独安装 .NET运行时。...该引用可能是对 .NET 的一种实现(例如 .NET Framework 或 .NET 5+)或对 .NET 的总体概念(包括所有实现)的引用。...有关更多信息,请参阅本机互操作性。 不安全代码 根据语言支持,CLR 允许您访问本机内存并通过unsafe代码进行指针运算。某些算法和系统互操作性需要这些操作。

2K20

将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj

第五步:删除 Properties 文件夹和里面的所有文件,因为这些信息已经被 csproj 文件记录并自动生成了。...比如,你可能放入项目的不止有 cs 文件,还有其他各种用途的资源——你需要重新选中他们然后在属性面板中设置文件的生成属性。...无论依赖了谁还是被谁依赖,都是此项目发生“NuGet”错误。...其实这是只有新的项目文件才会出现的编译错误,而错误原因是 NuGet 的缓存文件中与包引用相关的信息已经不正确了,需要运行 nuget restore 或者 dotnet restore 重新更新此文件才行...但是,只有使用了 Microsoft.NET.Sdk 的新 csproj 文件才会在执行了此命令后重新生成正确的包引用缓存文件;原来的格式并不会生成此文件,也就是说,无法修复。

1.4K20

进攻性横向移动

当用户登录,系统通过将其与存储在安全数据库中的信息进行比较来验证用户的密码。当用户的凭据通过身份验证,系统会生成访问令牌。代表此用户执行的每个进程都有此访问令牌的副本。...在不深入研究 Windows 身份验证的情况下,访问令牌引用登录会话,这是用户登录 Windows 创建的。 网络登录(类型 3):网络登录发生在帐户向远程系统/服务进行身份验证。...因此,当用户通过网络登录登录到远程系统,用户的凭据将不会出现在远程系统上以执行进一步的身份验证。...MSBuild.exe 是 Microsoft 签名的可执行文件,随 .NET 框架包一起安装。MSBuild 用于通过提供架构的 XML 文件编译/构建 C# 应用程序。...从攻击者的角度来看,这用于编译 C# 代码以生成恶意二进制文件或有效负载,甚至直接从 XML 文件运行有效负载。

2.1K10

如何在 csproj 中用 C# 代码写一个内联的编译任务 Task

---- 前置知识 在阅读本文之前,你至少需要懂得: csproj 文件的结构以及编译过程 Target 是什么,Task 是什么 所以如果你不懂或者理不清,则请先阅读: 理解 C# 项目 csproj...不过,默认你需要编写一个额外的项目来写 Task,然后将这个项目生成 dll 供编译过程通过 UsingTask 来使用。然而如果 Task 足够简单,那么依然需要那么复杂的过程显然开发成本过高。...于是现在可以编写内联的 Task: 内联任务的支持需要用到 Microsoft.Build.Tasks.v4.0.dll; 我们用 来内嵌 C# 代码; 除了用 UsingTask 编写内联的 Task 外,我们需要额外编写一个 Target 来验证我们的内联 Task 能正常工作。...本文会经常更新,请阅读原文: https://blog.walterlv.com/post/write-msbuild-inline-task.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验

1.6K21

每次都要重新编译?太慢!让跨平台的 MSBuilddotnet build 的 Target 支持差量编译

不然——当你的项目大起来的时候,就会感受到每次都重新编译,每次重复调试的过程都要进行漫长等待的绝望和无奈。 如果你正遭遇差量编译失效,每次都要重新编译的问题,那么阅读本文应该能够帮助你解决问题。...如果你觉得上面的写法非常陌生,或者说不清楚那个 Target 节点的作用,建议先阅读: 理解 C# 项目 csproj 文件格式的本质和编译流程 - 吕毅 如何创建一个基于 MSBuild Task 的跨平台的...当两者都没有指定时,MSBuild 会认定为此 Target 在每次编译都会执行 当两者都指定时,MSBuild 会认定为此 Target 需要进行差量执行 不能只指定其中的一个而不指定另一个(MSBuild...如果不清楚 和 的作用,建议建议先阅读理解 C# 项目 csproj 文件格式的本质和编译流程 - 吕毅。...本文会经常更新,请阅读原文: https://walterlv.com/post/msbuild-incremental-build.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验

1.2K10

.NET 8 中 Android 资源生成的改进和变化

点击蓝字 关注我们 作者:Dean Ellis 排版:Rani Sun 随着 .NET 8 的发布,我们引入了一个新系统,用于生成访问 Android 资源的 C# 代码。...新系统依赖于解析 aapt2 在构建过程中生成的 R.txt 文件。在运行 C# 编译器之前,将解析 R.txt 文件并生成新的程序集。...view=net-7.0 我的 NuGet 包仍然有效吗? 有些人可能担心通过此更改,现有的包引用将停止工作。不用担心,新系统引入了一个修剪步骤,它将会升级旧系统的程序集引用以使用新系统。...首先,不需要随 NuGet 一起提供新的 _Microsoft.Android.Resource.Designer.dll。它将由使用 NuGet 的应用程序在构建生成。...如果不包含.aar,在运行时将会出现资源丢失错误,例如: System.MissingMethodException: 'Method not found: int .Style.get_MyTheme

21410

VisualStudio 2017 项目格式 自动生成版本号 添加注释防止警告生成的文件自动添加版本

一些生成的文件会让 VisualStudio 编译警告,使用下面代码可以让 VisualStudio 不分析生成的文件 <Target Name="PragmaWarningDisablePrefixer...但是很多小伙伴都是设置打包的版本号和项目版本号相同,这样如果有人说某个nuget<em>出现</em>问题,可以很快找到是哪里的问题。...或者发布出去的包,可以通过查看 <em>dll</em> 的版本号就知道是哪个 Nuget 发布,因为 <em>dll</em> 的版本号和 nuget 的相同。...参见:Roland Weigelt - How to Disable Warnings in Generated <em>C#</em> Files of UWP Apps ?...AE%E6%A0%BC%E5%BC%8F-%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E7%89%88%E6%9C%AC%E5%8F%B7.html ,以避免陈旧<em>错误</em>知识的误导

2.8K20

WPF 程序的编译过程

如果 XAML 文件包含 x:Class 属性,那么就会根据语言生成一份代码文件;对于 C# 语言,会生成“文件名.g.cs”文件。...下面这几篇博客就是在讨论其中的一些坑: 制作通过 NuGet 分发的源代码包,如果目标项目是 WPF 则会出现一些问题 Roslyn 如何基于 Microsoft.NET.Sdk 制作源代码包 我需要摘抄生成临时程序集的一部分源码...新生成的临时项目文件相比于原来的项目文件,包含了这些修改: 添加了第一轮 XAML 编译传递(MarkupCompilePass1)生成的 .g.cs 文件; 将所有引用方式收集到的引用全部换成 ReferencePath...的情况下,无论是项目引用还是 NuGet 包引用,都会被换成普通的 dll 引用,因为这个时候目标项目都已经编译完成,包含可以被引用的程序集。...比如下面这个: 制作通过 NuGet 分发的源代码包,如果目标项目是 WPF 则会出现一些问题 更典型的,就是 SourceYard 项目,这个 Bug 给 SourceYard 造成了不小的困扰:

39930
领券