walterlv的专栏

热爱设计,不止是程序,更是艺术!

理解 Roslyn 中的红绿树(Red-Green Trees)

Roslyn 的 API 是非常易用的。即便如此复杂的 C# 语法,建立的复杂的 C# 语法树,还有其复杂的树遍历和修改过程,也都被其 API 包装得干净简洁。 而这背后是它的重要设计思路 —— 红绿树。 红绿树的影子 如果你是通过搜索找到这篇文章的,那么至少证明你调试过 Ros...

2018-07-19 20:09:36

阅读数:31

评论数:0

Roslyn 语法树中的各种语法节点及每个节点的含义

使用 Roslyn 进行源码分析时,我们会对很多不同种类的语法节点进行分析。如果能够一次性了解到各种不同种类的语法节点,并明白其含义和结构,那么在源码分析的过程中将会更加得心应手。 本文将介绍 Roslyn 中各种不同的语法节点、每个节点的含义,以及这些节点之间的关系和语法树结构。 ...

2018-07-19 20:03:56

阅读数:5

评论数:0

WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)

WPF 自定义窗口样式有多种方式,不过基本核心实现都是在修改 Win32 窗口样式。然而,Windows 上的应用就应该有 Windows 应用的样子嘛,在保证自定义的同时也能与其他窗口样式保持一致当然能最大程度保证 Windows 操作系统上的体验一致性。 本文将使用 WindowChrome...

2018-07-19 20:03:10

阅读数:31

评论数:0

在制作跨平台的 NuGet 工具包时,如何将工具(exe/dll)的所有依赖一并放入包中

NuGet 提供了工具类型的包支持,生成一个基于 .NET Core 的 dll 或者基于 .NET Framework 的 exe 之后,你几乎可以对项目做任何事情。但是,默认情况下,NuGet 不会将这些工具的依赖一起打包进入 NuGet 包 nupkg 文件内,这就使得功能比较复杂的跨平台 ...

2018-07-19 19:56:04

阅读数:14

评论数:0

如何在 .NET 库的代码中判断当前程序运行在 Debug 下还是 Release 下

我们经常会使用条件编译符 #if DEBUG 在 Debug 下执行某些特殊代码。但是一旦我们把代码打包成 dll,然后发布给其他小伙伴使用的时候,这样的判断就失效了,因为发布的库是 Release 配置的;那些 #if DEBUG 的代码根本都不会编译进库中。然而总有时候希望在库中也能得知程序是...

2018-07-05 21:01:47

阅读数:16

评论数:0

.NET 使用 XPath 来读写 XML 文件

XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言。无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件。 本文将介绍 .NET 中的 XPath 相关类型的使用。 本文读写的 XML 文件会以 文章末尾的代...

2018-06-26 20:58:08

阅读数:29

评论数:0

XML 的 XPath 语法

XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言。无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件。 本文将介绍 XPath 的一些语法。 本文读写的 XML 文件会以 文章末尾的代码 - 假设的 XM...

2018-06-26 20:56:44

阅读数:14

评论数:0

C#/.NET 中推荐的 Dispose 模式的实现

如果你觉得你的类需要实现 IDisposable 接口,还是需要注意一些坑的。不过前人准备了 Dispose 模式 供我们参考,最大程度避免这样的坑。 C#程序中的 Dispose 方法,一旦被调用了该方法的对象,虽然还没有垃圾回收,但实际上已经不能再使用了。所以使用上要仔细考虑细节。 需...

2018-06-26 20:51:43

阅读数:25

评论数:0

如何使用 MSBuild Target(Exec)中的控制台输出

我曾经写过一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包,通过编写一个控制台程序来参与编译过程。但是,相比于 基于 Task 的方式,可控制的因素还是太少了。 有没有什么办法能够让控制台程序也能与 MSBuild Target 之间发生更多的信息交换呢?答案是有的,通过捕获控...

2018-06-26 20:51:11

阅读数:51

评论数:0

如何根据一个绝对文件路径生成一个相对文件路径

日常的开发中,获取绝对文件路径才是主流吧!连 Path.GetFullPath 这种生成绝对路径的方法都已经成为 .NET Standard 的一部分了。 然而,生成相对路径依然有用——比如你的配置文件是相对于工作目录的,必须这个路径是输出给用户看的…… 那么,既然 Path 没有生成相对...

2018-06-26 20:48:29

阅读数:10

评论数:0

.NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?

本文将解释在 .NET 技术栈中各种不同使用方式下 N E T 三个字母何时大写何时小写;前面的 “.” 什么时候加上,什么时候去掉,什么时候又使用 “dot”。 .NET 在技术文档中 如果你阅读过 https://docs.microsoft.com/zh-cn/dotnet/...

2018-06-04 11:28:29

阅读数:61

评论数:2

Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码

Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。以至于我们只需要编写很少量的代码便能够编译并执行我们的代码。 作为 Roslyn 入门篇文章之一,你将可以通过本文学习如何开始编写一个 Roslyn 扩展项目 —— 编译一个类,然后执行其中的一段代码。 本文是 Rosly...

2018-06-02 09:22:56

阅读数:166

评论数:0

神器如 dnSpy,无需源码也能修改 .NET 程序

dnSpy 是 0xd4d 开发的 .NET 程序调试神器。 说它是神器真的毫不为过!它能在完全没有源码的情况下即时调试程序,甚至还能修改程序!本文讲向大家介绍如何使用 dnSpy 修改 .NET 程序。 如果你发现本文原本应该有图的地方却没有看到图片,那可能是被某种特殊的网络屏蔽了。请移...

2018-05-25 21:31:56

阅读数:272

评论数:1

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

MSBuild 的 Task 为我们扩展项目的编译过程提供了强大的扩展性,它使得我们可以用 C# 语言编写扩展;利用这种扩展性,我们可以为我们的项目定制一部分的编译细节。NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法,同时还是一个 .NET 的包平台;我们可以利用...

2018-05-19 08:10:45

阅读数:168

评论数:2

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

命令行可是跨进程通信的一种非常方便的手段呢,只需启动一个进程传入一些参数即可完成一些很复杂的任务。NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法,同时还是一个 .NET 的包平台;我们可以利用 NuGet 发布我们的工具并自动启用这样的工具。 制作这样的一个跨平...

2018-05-19 08:04:49

阅读数:144

评论数:2

项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)

知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦。(毕竟 nuspec 文件没有 .csproj 和 .targets 文件强大而又有扩展性。) “项目文件中的已知属性系列”...

2018-05-19 07:55:25

阅读数:70

评论数:2

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件,不过全过程是手工进行的,而且到最后处理 XAML 问题也非常头疼。 现在,我们可以利用工具自动地完成这个过程。当然,工具并不将 csproj ...

2018-04-27 07:16:35

阅读数:442

评论数:0

如何快速编写和调试 Emit 生成 IL 的代码

.NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力。利用这项能力,我们能够在运行时生成一段代码/一个方法/一个类/一个程序集。 大家都知道反射的性能很差,通过缓存反射调用的方法则能够大幅提升性能。Em...

2018-04-27 07:14:06

阅读数:54

评论数:0

使用 Emit 生成 IL 代码

.NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力。利用这项能力,我们能够在运行时生成一段代码/一个方法/一个类/一个程序集。 本文将介绍使用 Emit 生成 IL 代码的方法,以及在此过程中可能遇到...

2018-04-27 07:10:10

阅读数:56

评论数:0

使用 GitVersion 在编译或持续构建时自动使用语义版本号(Semantic Versioning)

我们在之前谈过 语义版本号(Semantic Versioning),在项目中应用语义版本号能够帮助库的开发者在发布包时表明更多的语义信息。这是趋势,从微软的博客 Versioning NuGet packages in a continuous delivery world 三部曲中可以看出,从...

2018-04-15 10:38:42

阅读数:106

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭