dotnet
文章平均质量分 88
walter lv
这个作者很懒,什么都没留下…
展开
-
阻止某个 NuGet 包意外升级
出于兼容性考虑,我们可能不再更新某个项目的 NuGet 包。典型的情况是软件版本进行了大规模的不兼容的升级,需要对旧格式的数据进行读取,以便迁移到新格式的数据。然而,团队开发的软件可能因为某个小伙伴不知道这样的历史问题,从而手抖将某个不应该更新的 NuGet 包更新了,于是迁移就挂了。本文提供了一种方法来避免某些特定 NuGet 包的升级。如果你只关心结果,请直接前往最后一节:终极解决方案...原创 2020-01-28 17:40:49 · 419 阅读 · 0 评论 -
使用 LINQ to XML,.NET 让生成 XML 文件变得和直接写 XML 一样轻松
由 .NET Framework 3.5 引入,并依然在 .NET Core 中发扬光大的 LINQ to XML 让编写 XML 文件变得非常轻松。使用 XElement、XAttribute 我们能够完整构造一个 XML 出来。为了能直观地体会到优势,我写一个最简单的例子:var root = new XElement("Root", new XAttribute("Attrib...原创 2020-01-28 17:37:49 · 344 阅读 · 0 评论 -
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
NuGet 原本就提供了生成源码包的功能。不过,NuGet 原生的源码包仅用于调试时自带调试信息和调试源码。本文将以最简单的方式制作一个源码引用包。安装 NuGet 包后,不会生成任何程序集引用,而是相当于将源码直接放入被安装的程序集中一样。本文内容准备工作将源码加入 NuGet 包安装 NuGet 包时引入源码准备工作我们需要一个可以用来打 NuGet 包的 .NET Core 项目,...原创 2020-01-28 17:36:05 · 660 阅读 · 1 评论 -
如何在 MSBuild Target(Exec)中报告编译错误和编译警告
我曾经写过一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包,通过编写一个控制台程序来参与编译过程。但是,相比于 基于 Task 的方式,可控制的因素还是太少了。有没有什么办法能够让控制台程序也能与 MSBuild Target 之间发生更多的信息交换呢?比如报告编译错误和编译警告?答案是有的,通过格式化控制台输出。本文内容编译错误和编译警告更复杂的错误和警告控制阻止编译错误...原创 2020-01-28 17:33:48 · 393 阅读 · 0 评论 -
如何让 .NET Core 命令行程序接受密码的输入而不显示密码明文
如果是在 GUI 中要求用户输入密码,各 UI 框架基本都提供了用于输入密码的控件;在这些控件中,用户在输入密码的时候会显示掩码。然而对于控制台程序来说,并没有用于输入密码的原生方法。本文将讲述一种在控制台中输入密码,并仅显示掩码的方法。开始简单的程序让我们开始一个简单的 .NET Core 控制台程序。static void Main(string[] args){ Cons...原创 2020-01-28 17:24:32 · 479 阅读 · 0 评论 -
Sdk 风格的 csproj 对 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras
自从微软推出 .NET Core 以来,新的项目文件格式以其优秀的可扩展性正吸引着更多项目采用。然而——微软官方的 WPF/UWP 项目模板依然还在采用旧的 csproj 格式!这只是因为——在 .NET Core 3.0 以前,基于 Microsoft.NET.Sdk 的官方 SDK 依然对 WPF/UWP 支持不够友好。本文内容为什么要使用第三方的 SDK?如何使用 MSBuild.Sd...原创 2020-01-28 17:21:13 · 884 阅读 · 0 评论 -
让你编写的控件库在 XAML 中有一个统一的漂亮的命名空间(xmlns)和命名空间前缀
在 WPF XAML 中使用自己定义的控件时,想必大家都能在 XAML 中编写出这个控件的命名空间了。然而——我写不出来,除非借助 ReSharper。如果控件能够有一个漂亮的命名空间和命名空间前缀呢?——好吧,还是写不出来,不过,至少漂亮些。本文将指导你自定义在 XAML 中使用的命名空间。本文内容达到什么样的效果?这是怎么做到的呢?还有什么更高级的玩法吗?一些限制参考资料达到什么样的效...原创 2020-01-28 17:19:20 · 649 阅读 · 2 评论 -
推荐 .NET/C# 开发者安装的几款代码分析插件或对应的代码分析 NuGet 包
如果你使用的是旧版本的 Visual Studio,那么默认的代码分析规则集是“最小建议规则集”。基于这个,写出来的代码其实只能说是能跑通过而已。随着 Roslyn 的发布,带来了越来越多更强大的代码分析器,可以为编写高质量的代码带来更多的帮助。作为 .NET/C# 开发者,强烈建议安装本文推荐的几款代码分析器。本文内容推荐类型简介Visual Studio 2019 自带的分析器Micro...原创 2019-12-30 08:49:39 · 2616 阅读 · 0 评论 -
在 WPF 程序中应用 Windows 10 真•亚克力效果
从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了。不过相比于 UWP 来说,可定制性会差很多。本文介绍如何在 WPF 程序中应用 Windows 10 真•亚克力效果。(而不是一些流行的项目里面自己绘制的亚克力效果。)本文内容API如何使用注意事项API需要使用的 API 是微软的文档中并未公开的 SetWindowComposit...原创 2019-12-30 08:48:51 · 3582 阅读 · 0 评论 -
在 MSBuild 编译过程中操作文件和文件夹(检查存在/创建文件夹/读写文件/移动文件/复制文件/删除文件夹)
本文整理 MSBuild 在编译过程中对文件和文件夹处理的各种自带的编译任务(Task)。本文内容`Exists` 检查文件存在`MakeDir` 创建文件夹`Move` 移动文件`Copy` 复制文件`Delete` 删除文件`ReadLinesFromFile` 读取文件`WriteLinesToFile` 写入文件`RemoveDir` 删除文件夹Exists 检查文件存在使用 Ex...原创 2019-12-30 08:45:39 · 2500 阅读 · 0 评论 -
屏幕边缘上有趣的 1 个像素,看不见、摸不到
如果你的屏幕分辨率是 1920×1080,那么一个全屏的窗口程序尺寸是多少呢?想都不用想,是 1920×1080。那么输入设备输入的坐标是多少呢?是 X∈[0, 1919] ?还是 X∈[1, 1920] ?还是 X∈[0, 1920] ?本文内容鼠标输入与触摸输入有趣的 1 像素防踩坑秘籍鼠标输入与触摸输入一个有趣的问题,因为 1920×1080 分辨率的屏幕,其横向只有 1920 个...原创 2019-12-30 08:44:21 · 361 阅读 · 0 评论 -
如何将一个 .NET 对象序列化为 HTTP GET 的请求字符串
HTTP GET 请求时携带的参数直接在 URL 中,形式如 ?key1=value&key2=value&key3=value。如果是 POST 请求时,我们可以使用一些库序列化为 json 格式作为 BODY 发送,那么 GET 请求呢?有可以直接将其序列化为 HTTP GET 请求的 query 字符串的吗?本文内容HTTP GET 请求库?方法HTTP GET 请求...原创 2019-12-30 08:42:57 · 589 阅读 · 0 评论 -
如何在 MSBuild 中正确使用 % 来引用每一个项(Item)中的元数据
MSBuild 中写在 <ItemGroup /> 中的每一项是一个 Item,Item 除了可以使用 Include/Update/Remove 来增删之外,还可以定义其他的元数据(Metadata)。使用 % 可以引用 Item 的元数据,本文将介绍如何正确使用 % 来引用每一个项中的元数据。本文内容定义 Item 的元数据引用元数据使用元数据关于项元数据的其他信息定义 I...原创 2019-12-30 08:42:20 · 319 阅读 · 0 评论 -
使用 MSBuild Target 复制文件的时候如何保持文件夹结构不变
使用 MSBuild 中的 Copy 这个编译目标可以在 .NET 项目编译期间复制一些文件。不过使用默认的参数复制的时候文件夹结构会丢失,所有的文件会保留在同一级文件夹下。那么如何在复制文件的时候保持文件夹结构与原文件夹结构一样呢?本文内容CopyRecursiveDirCopy下面是一个典型的使用 MSBuild 在编译期间复制文件的一个编译目标。<Target Name="...原创 2019-12-30 08:40:06 · 817 阅读 · 0 评论 -
一个简单的方法:截取子类名称中不包含基类后缀的部分
基类是 MenuItem,子类是 WalterlvMenuItem、FooMenuItem。基类是 Configuration,子类是 WalterlvConfiguration、ExtensionConfiguration。在代码中,我们可能会为了能够一眼看清类之间的继承(从属)关系而在子类名称后缀中带上基类的名称。但是由于这种情况下的基类不参与实际的业务,所以对外(文件/网络)的名称通常不需要...原创 2019-12-30 08:35:36 · 182 阅读 · 0 评论 -
C# 8.0 的可空引用类型,不止是加个问号哦!你还有很多种不同的可空玩法
C# 8.0 引入了可空引用类型,你可以通过 ? 为字段、属性、方法参数、返回值等添加是否可为 null 的特性。但是如果你真的在把你原有的旧项目迁移到可空类型的时候,你就会发现情况远比你想象当中复杂,因为你写的代码可能只在部分情况下可空,部分情况下不可空;或者传入空时才可为空,传入非空时则不可为空。本文内容C# 8.0 可空特性更灵活控制的可空特性输入:`AllowNull`输入:`Dis...原创 2019-12-30 08:35:07 · 3941 阅读 · 1 评论 -
可集成到文件管理器,一句 PowerShell 脚本发布某个版本的所有 NuGet 包
要发布 NuGet 包,只需要执行命令 nuget push xxx.nupkg 即可,或者去 nuget.org 点鼠标上传。不过,如果你有很多的 NuGet 包并且经常需要推送的话,也可以集成到 Directory Opus 或者 Total Commander 中。本文内容NuGet 推送命令用 PowerShell 包装一下集成到 Directory OpusNuGet 推送命令...原创 2019-12-30 08:32:26 · 456 阅读 · 0 评论 -
C#/.NET 当我们在写事件 += 和 -= 的时候,方法是如何转换成事件处理器的
当我们在写 += 和 -= 事件的时候,我们会在 += 或 -= 的右边写上事件处理函数。我们可以写很多种不同的事件处理函数的形式,那么这些形式都是一样的吗?如果你不注意,可能出现内存泄漏问题。本文将讲解事件处理函数的不同形式,理解了这些可以避免编写代码的时候出现内存相关的问题。本文内容典型的事件处理函数变种事件处理函数编译器类型转换不是同一个委托实例`+=` `-=` 是怎么做的`-=`...原创 2019-12-30 08:27:43 · 1723 阅读 · 0 评论 -
.NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
我们知道,32 位程序在读取注册表的时候,会自动将注册表的路径映射到 32 位路径下,即在 Wow6432Node 子节点下。但是 64 位程序不会映射到 32 位路径下。那么 64 位程序如何读取到 32 位程序写入的注册表路径呢?本文内容Wow6432Node如何在 64 位程序中读取 32 位注册表路径Walterlv.Win32Wow6432Node对于 32 位程序,读取注册表...原创 2019-12-30 08:25:28 · 836 阅读 · 0 评论 -
将 Direct3D11 在 GPU 中的纹理(Texture2D)导出到内存(Map)或导出成图片文件
Direct3D11 的使用通常不是应用程序唯一的部分,于是使用 Direct3D11 的代码如何与其他模块正确地组合在一起就是一个需要解决的问题。本文介绍将 Direct3D11 在 GPU 中绘制的纹理映射到内存中,这样我们可以直接观察到此纹理是否是正确的,而不用担心是否有其他模块影响了最终的渲染过程。本文内容SharpDX来自于 Direct3D11 的渲染纹理关键代码(SharpDX...原创 2019-12-30 08:23:36 · 4395 阅读 · 1 评论 -
使用 Direct3D11 的 OpenSharedResource 方法渲染来自其他进程/设备的共享资源(SharedHandle)
如果你得到了一个来自于其他进程或者其他模块的 Direct3D11 的共享资源,即 SharedHandle 句柄,那么可以使用本文提到的方法将其转换成 Direct3D11 的设备和纹理,这样你可以进行后续的其他处理。本文内容SharpDXSharedHandleOpenSharedResource后续操作获取 Texture2D获取 Texture2DDescription获取 Surfa...原创 2019-12-30 08:06:18 · 3458 阅读 · 1 评论 -
.NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
我们知道 Windows 系统 NTFS 文件系统提供了硬连接功能,可以通过 mklink 命令开启。如果能够通过代码实现,那么我们能够做更多有趣的事情。本文提供使用 .NET/C# 代码创建 NTFS 文件系统的硬连接功能(目录联接)。本文内容目录联接使用 .NET/C# 实现使用 JunctionPoint目录联接以管理员权限启动 CMD(命令提示符),输入 mklink 命令可以得...原创 2019-12-30 08:05:28 · 956 阅读 · 0 评论 -
WPF 高性能位图渲染 WriteableBitmap 及其高性能用法示例
WPF 渲染框架并没有对外提供多少可以完全控制渲染的部分,目前可以做的有:D3DImage,用来承载使用 DirectX 各个版本渲染内容的控件WriteableBitmap,通过一段内存空间来指定如何渲染一个位图的图片HwndHost,通过承载一个子窗口以便能叠加任何种类渲染的控件本文将解释如何最大程度压榨 WriteableBitmap 在 WPF 下的性能。本文内容如何使用 ...原创 2019-12-30 08:04:27 · 8349 阅读 · 0 评论 -
如何在 .NET 项目中开启不安全代码(以便启用 unsafe fixed 等关键字)
有小伙伴希望在 .NET 代码中使用指针,操作非托管资源,于是可能使用到 unsafe fixed 关键字。但使用此关键字的前提是需要在项目中开启不安全代码。本文介绍如何在项目中开启不安全代码。本文内容入门方法高级方法临时方法其他说明入门方法第一步:在你需要启用不安全代码的项目上点击右键,然后选择属性:第二步:在“生成”标签下,勾选上“允许不安全代码”:第三步:切换到 Relea...原创 2019-12-30 08:02:43 · 2506 阅读 · 1 评论 -
使用 .editorconfig 配置 .NET/C# 项目的代码分析规则的严重程度
随着 Visual Studio 2019 更新,在 Visual Studio 中编写代码的时候也带来了基于 Roslyn 的代码质量分析。有一些代码分析严重程度可能与团队约定的不一致,这时就需要配置规则的严重程度。另外如果是个人使用插件安装了分析器,也可以配置一些严重程度满足个人的喜好。本文介绍使用 .editorconfig 文件来配置 .NET/C# 项目中,代码分析规则的严重性。可以是...原创 2019-12-30 08:01:38 · 1750 阅读 · 0 评论 -
什么是模态窗口?本文带你了解模态窗口的本质
做 Windows 桌面应用开发的小伙伴们对“模态窗口”(Modal Dialog)一定不陌生。如果你希望在模态窗口之上做更多的事情,或者自己实现一套模态窗口类似的机制,那么你可能需要了解模态窗口的本质。本文不会太深,只是从模态窗口一词出发,抵达大家都熟知的一些知识为止。本文内容开发中的模态窗口模态窗口的三个特点实现模态窗口API 调用禁用主窗口阻塞代码等待操作完成进行 UI 强提醒开发中...原创 2019-11-27 08:05:33 · 9358 阅读 · 0 评论 -
直击本质:WPF 框架是如何实现模态窗口的
想知道你在 WPF 编写 Window.ShowDialog() 之后,WPF 框架是如何帮你实现模态窗口的吗?本文就带你来了解这一些。本文内容`Window.ShowDialog``ShowHelper`Window.ShowDialogWPF 显示模态窗口的方法就是 Window.ShowDialog,因此我们直接进入这个方法查看。由于 .NET Core 版本的 WPF 已经开源,...原创 2019-11-27 08:01:45 · 1301 阅读 · 0 评论 -
Windows 系统上用 .NET/C# 查找所有窗口,并获得窗口的标题、位置、尺寸、最小化、可见性等各种状态
在 Windows 应用开发中,如果需要操作其他的窗口,那么可以使用 EnumWindows 这个 API 来枚举这些窗口。你可以使用本文编写的一个类型,查找到所有窗口中你关心的信息。本文内容需要使用的 API枚举所有窗口附源码需要使用的 API枚举所有窗口仅需要使用到 EnumWindows,其中需要定义一个委托 WndEnumProc 作为传入参数的类型。剩下的我们需要其他各种方法...原创 2019-11-27 08:01:00 · 5588 阅读 · 2 评论 -
.NET/C# 检测电脑上安装的 .NET Framework 的版本
如果你希望知道某台计算机上安装了哪些版本的 .NET Framework,那么正好本文可以帮助你解决问题。本文内容如何找到已安装的 .NET Framework注册表位置和含义读取注册表如何找到已安装的 .NET Framework有的电脑的 .NET Framework 是自带的,有的是操作系统自带的。这样,你就不能通过控制面板的“卸载程序”去找到到底安装了哪个版本的 .NET Fram...原创 2019-11-27 07:59:50 · 3415 阅读 · 0 评论 -
使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景(可以做 Acrylic 亚克力效果、模糊效果、主题色效果等)
Windows 系统中有一个没什么文档的 API,SetWindowCompositionAttribute,可以允许应用的开发者将自己窗口中的内容渲染与窗口进行组合。这可以实现很多系统中预设的窗口特效,比如 Windows 7 的毛玻璃特效,Windows 8/10 的前景色特效,Windows 10 的模糊特效,以及 Windows 10 1709 的亚克力(Acrylic)特效。而且这些组合...原创 2019-11-27 07:58:55 · 8391 阅读 · 9 评论 -
WPF 程序如何移动焦点到其他控件
WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点。本文介绍如何在 WPF 程序中控制控件的焦点。本文内容`UIElement.Focus``TraversalRequest`关于逻辑焦点和键盘焦点跨窗口/跨进程切换焦点UIElement.Focus仅仅需要在任何一个控件上调用 Focus() 方法...原创 2019-11-27 07:50:30 · 2877 阅读 · 0 评论 -
使用 SetParent 制作父子窗口的时候,如何设置子窗口的窗口样式以避免抢走父窗口的焦点
制作传统 Win32 程序以及 Windows Forms 程序的时候,一个用户看起来独立的窗口本就是通过各种父子窗口嵌套完成的,有大量窗口句柄,窗口之间形成父子关系。不过,对于 WPF 程序来说,一个独立的窗口实际上只有一个窗口句柄,窗口内的所有内容都是 WPF 绘制的。如果你不熟悉 Win32 窗口中的父子窗口关系和窗口样式,那么很有可能遇到父子窗口之间“抢夺焦点”的问题,本文介绍如何解决这...原创 2019-11-27 07:49:47 · 2925 阅读 · 0 评论 -
WPF 程序如何跨窗口/跨进程设置控件焦点
WPF 程序提供了 Focus 方法和 TraversalRequest 来在 WPF 焦点范围内转移焦点。但如果 WPF 窗口中嵌入了其他框架的 UI(比如另一个子窗口),那么就需要使用其他的方法来设置焦点了。一个粗略的设置方法是,使用 Win32 API:SetFocus(hwnd);传入的是要设置焦点的窗口的句柄。参考资料winapi - Win32: C++: How d...原创 2019-11-27 07:47:47 · 865 阅读 · 0 评论 -
.NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。然而我们不是什么项目都能引用 WPF 框架类库的。本文介绍 Walterlv.WeakEvents 库来定义和使用弱事件。本文内容下载安装 Walterlv.WeakEvents定义弱事件使用弱事件系列博客...原创 2019-11-27 07:47:03 · 345 阅读 · 0 评论 -
.NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。然而我们不是什么项目都能引用 WPF 框架类库的。网上有很多弱事件的 NuGet 包,不过仅仅支持定义事件的时候写成弱事件而不支持让任意事件变成弱事件,并且存在性能问题。本文介绍 Walterlv.WeakEve...原创 2019-11-27 07:45:45 · 324 阅读 · 0 评论 -
.NET 设计一套高性能的弱事件机制
弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。然而我们不是什么项目都能引用 WPF 框架类库的。网上有很多弱事件的 NuGet 包,不过仅仅支持定义事件的时候写成弱事件而不支持让任意事件变成弱事件,并且存在性能问题。本文将设计一套弱事件机制,不止可以让任意一...原创 2019-11-27 07:44:55 · 355 阅读 · 0 评论 -
如何在 WPF 中获取所有已经显式赋过值的依赖项属性
获取 WPF 的依赖项属性的值时,会依照优先级去各个级别获取。这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值的。有什么方法可以获取哪些属性被显式赋值过呢?如果是 CLR 属性,我们可以自己写判断条件,然而依赖项属性没有自己写判断条件的地方。本文介绍如何获取以及显式赋值过的依赖项属性。需要用到 DependencyObject.GetLocalValueEnumerator() 方...原创 2019-11-27 07:44:05 · 458 阅读 · 0 评论 -
在 WPF 中获取一个依赖对象的所有依赖项属性
本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性。本文内容通过 WPF 标记获取通过设计器专用方法获取通过 WPF 标记获取public static IEnumerable<DependencyProperty> EnumerateDependencyProperties(object element){ if (element is null) ...原创 2019-11-27 07:43:34 · 615 阅读 · 0 评论 -
WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)
在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None"、AllowsTransparency="True" 这两个属性。如果不想自定义窗口样式,还需要设置 Background="Transparent"。这样的设置会让窗口变成 Layered Window,WPF 在这种类型窗口上的渲染性能是非常糟糕的。本文介绍如何使用 WindowChrome ...原创 2019-11-27 07:42:44 · 3618 阅读 · 0 评论 -
.NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
在 Windows 系统中,一段时间不操作键盘和鼠标,屏幕便会关闭,系统会进入睡眠状态。但有些程序(比如游戏、视频和演示文稿)在运行过程中应该阻止屏幕关闭,否则屏幕总是关闭,会导致体验会非常糟糕。本文介绍如何编写 .NET/C# 代码临时阻止屏幕关闭以及系统进入睡眠状态。本文内容Windows APIAPI 封装Windows API我们需要使用到一个 Windows API:/// ...原创 2019-11-27 07:36:51 · 6141 阅读 · 1 评论