取消

用 WiX 制作安装包:为 WiX 制作的 msi 安装包添加 .NET Framework 环境检查

本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。 前面我们制作完成了一个简单的 msi 安装包。如果我们要安装的程序运行需要 .NET Framework 环境,那么也可以先进行 .NET Framework 版本检查。 本文将指导你在 msi 安装前检查 .NET Framework 的版本。 本文基于前一篇文章已经建好的项目继续: ...

用 WiX 制作安装包:创建一个简单的 msi 安装包

本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。 本文将带大家制作一个简单的 msi 安装包。 本文操作基于系列教程中的一个最简项目,见 准备一个用于学习 WiX 安装包制作的 Visual Studio 解决方案。如果你没准备这样的项目,拿一个现成的项目也行,毕竟打包对目标程序的形式没有任何要求,只要是一个能跑起来的程序即可。 创建 Wi...

用 WiX 制作安装包:为 WiX 制作的 exe 安装包添加 .NET Framework 前置的安装步骤

本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。 前面我们制作完成了一个简单的 exe 安装包。如果我们要安装的程序运行需要 .NET Framework 环境,那么可以检查 .NET Framework 是否安装,如果未安装则可将其装上。 小提示 Bundle(exe 格式)的判断方法和 Product(msi 格式)的不一样,因此...

用 WiX 制作安装包:安装 WiX Toolset 系列 Visual Studio 插件

本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。 本文介绍安装 WiX Toolset 的两款 Visual Studio 插件,以便你能直接在 Visual Studio 里完整整套安装包的制作,无需使用命令行工具。对初学 WiX 的开发者来说比较友好。 关于插件 Wix Toolset Visual Studio Extension 为...

用 WiX 制作安装包:安装 WiX Toolset 工具集

本文是 WiX Toolset 安装包制作入门教程 系列中的首篇,可前往阅读完整教程。 WiX 提供一组工具集,我们的安装包正是通过这一组工具集来编译生成的。你可以通过很多方式来安装这组工具集,本文会提到多种方案,但仅会详细说其中一种,以便让教程尽可能简单。 从官网下载安装 WiX Toolset 请前往其 GitHub 发布页下载: Releases · wixtoo...

用 WiX 制作安装包:准备一个用于学习 WiX 安装包制作的 Visual Studio 解决方案

本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。 严格来说,本文算不得教程,只是带大家创建一个需要被打包的项目。如果你本身对使用 Visual Studio 开发非常得心应手,本文完全可以跳过,你可以用你的任何一个现成的项目进行练手。 创建示例项目 我这里拿一个控制台项目示例,当作被打包的对象。 ▲ 启动 Visual Studio 创...

WiX 安装包制作最佳实践:Id、UpgradeCode 应该怎么设置?

在 WiX 安装包制作时,Product.wxs 文件中的 Product 标签中存在一些属性,这些属性应该如何设置才是比较合适的呢? 本文是对我另一篇入门教程博客的一点补充: 用 WiX 制作安装包:创建一个简单的 msi 安装包 Id、Version Id:产品 Id。 Version:产品版本。 关于这两个值的变化: 如果这两个值都没有更改...

WPF 窗口和控件的 Unloaded 事件什么情况下不会触发

WPF 中如果监听窗口或者控件的的 Unloaded 事件,那么这个事件会触发吗?答案是不确定的。 示例代码 <Window x:Class="Walterlv.TempDemo.Wpf.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...

编译并体验 .NET MAUI 官方示例代码

在微软的 Build 2021 大会上,微软发布了 .NET 6 Preview 4,同时发布了于它的 MAUI 第四个预览版。在 MAUI 成为 Visual Studio 2022 的官方工作负载之前,成功编译并运行 MAUI 的示例程序会比较麻烦,本文旨在帮助大家完成示例程序的编译运行和体验。 更新:现在已经 .NET 6 Preview 5 了,配上 Visual Studio 2...

Visual Studio 2022 出来啦!教你如何将 VS2019 的 VSIX 扩展/插件项目迁移到 VS2022

从 Visual Studio 2022 开始,Visual Studio 正式启用了 amd64 架构。为了确保扩展的兼容性,Visual Studio 2022 不会启用以前编译过的扩展,即使以前编译过的扩展把支持的 Visual Studio 版本号加到了 17.0(对应 VS2022)也不行。毕竟 x64 的进程真加载一个 x86 的程序集时,会炸得体无完肤。 因为保证安全,Vis...

两个方法,让 WPF 绘制的笔迹更加平滑

在 WPF 中绘制笔迹的时候,你可能会注意到绘制的笔迹非常的……呃……棱角分明。这在鼠标绘制的时候大家基本都能接受,但如果遇到一些触摸框报告触摸点也那么稀疏,那么写的字很不好看。另外,还有可能绘制的笔迹点来源于其他设备,通过网络传输而来,这时更容易遇到稀疏的点。 本文将用两种方法来让 WPF 的笔迹更加平滑。 两种方法 我们有两种方法来解决这样的问题: 点插值 曲线...

C# 的事件,一般你不需要担心它的线程安全问题!

时不时会有小伙伴跟我提到在 C# 写事件 += -= 以及 Invoke 时可能遇到线程安全问题。然而实际上这些操作并不会有线程安全问题,所以我特别写一篇博客来说明一下,从原理层面说说为什么不会有线程安全问题。 顺便再提一下哪种情况下你却可能遇到线程安全问题。 委托是不可变类型 委托是不可变类型。 这点很重要,这是 C# 事件一般使用场景不会发生线程安全问题的关键! ...

Windows 中的 HRESULT

Windows 协议文档中所描述的协议规范中,错误码使用 HRESULT、Win32 错误码和 NTSTATUS 来描述。本文科普一下 HRESULT。 一个简单的例子 我们先举一个大家可能常用的 HRESULT 例子,这样后面的介绍能更简单一点。 0x80070070 将它改写成二进制: 1000 0000 0000 0111 0000 0000 0111 0000 ...

无法加载为扩展“Microsoft.VisualStudio.Diagnostics.ServiceModelSink.Behavior”注册的类型

一天,某用户反馈过来说我们的软件无法运行,我一看异常信息看到了这个:“System.Configuration.ConfigurationErrorsException: 无法加载为扩展“Microsoft.VisualStudio.Diagnostics.ServiceModelSink.Behavior”注册的类型“Microsoft.VisualStudio.Diagnostics.S...

.NET 单个异步任务如何同时监听多个取消请求(CancellationToken)

异步编程中,并不是所有时候 await 等的都是新的异步任务;有时候同一个异步任务可能被多次等待,并且每个等待都可以有自己的取消请求,即 CancellationToken。那么如何在一个异步任务中同时响应多个取消请求呢? 可被多次 await 的单个任务 我们先来列举一个最简单的例子,用来作为多次取消请求的示例。 class WalterlvDemoClass { p...

从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)

默认情况下,我们打包 NuGet 包时,目标项目安装我们的 NuGet 包会引用我们生成的库文件(dll)。除此之外,我们也可以专门做 NuGet 工具包,还可以做 NuGet 源代码包。然而做源代码包可能是其中最困难的一种了,目标项目安装完后,这些源码将直接随目标项目一起编译。 本文将从零开始,教你制作一个支持 .NET 各种类型项目的源代码包。 前置知识 在开始制作一个源代...

在项目文件 / MSBuild / NuGet 包中编写扩展编译的时候,正确使用 props 文件和 targets 文件

.NET 扩展编译用的文件有 .props 文件和 .targets 文件。不给我选择还好,给了我选择之后我应该使用哪个文件来编写扩展编译的代码呢? 如果你不了解 .props 文件或者 .targets 文件,可以阅读下面的博客: 理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv 具体的例子有下面这些博客。不过大概阅读一下就好,这只是 .pr...

Windows 系统上如何揪出阻止你屏幕关闭的程序

使用 Win32 API SetThreadExecutionState 可以阻止进入屏幕保护程序,也能阻止屏幕关闭、阻止系统睡眠。这很方便,这也就可能造成各种参差不齐的程序都试图阻止你的屏幕关闭,于是来一个一整晚亮瞎眼就很难受。 本文教大家如何揪出阻止你屏幕关闭的程序。 我们主要使用系统自带的 powercfg 来查询相关的应用。因此,你需要以管理员权限打开你喜欢的终端。 命...

发现电脑屏幕总是不自动关闭?看看你是否打开了这些程序……

本文收集一些已知的导致电脑屏幕不关闭的程序。如果你发现无论你设置多短的屏幕关闭超时时间但一直都不关闭,那么可以参考本文检查是否打开了这些程序。 系统设置 电源和睡眠 先检查一下你系统设置中的电源和睡眠选项,时间不应该太长。一定要先看看这里,别到时候折腾了半天发现是自己设错了就亏了…… 另外,找程序的时候,不要第一眼看过去没有就忽略它了。因为你可能像我一样有很多个桌面。最好...

编写你的专属 MSBuild C# 代码生成器:在保存文件时自动实时生成你的代码

我之前的博客中有介绍如何在项目中生成额外的代码,也有介绍制作一个生成代码的 NuGet 包。而本文是在此基础上更进一步,可以让生成代码变成实时的;更准确的说,是在保存文件时即生成代码,而无需完整编译一次项目。 一天,头像全白昵称空格的“wuweilai”童鞋问我为什么 GRPC 的 NuGet 包能自动在 .proto 文件保存时更新生成的代码,怎么才能做到像它那样。然后,我研究了下 ...

Unity OpenVR 虚拟现实入门六:通过摇杆控制玩家移动

在 Unity 的帮助下,虚拟现实应用的开发非常容易。不过国内竟然还是没有什么教程,所以这里就来一点入门的,适合新手。 本文将基于第四篇的简单场景,通过摇杆的方式控制玩家移动。 系列博客: Unity OpenVR 虚拟现实入门一:安装配置 Unity + OpenVR 环境 Unity OpenVR 虚拟现实入门二:一个最简单的虚拟现实游戏/程序 Unity Ope...

Unity OpenVR 虚拟现实入门四:通过脚本控制手与控制器

在 Unity 的帮助下,虚拟现实应用的开发非常容易。不过国内竟然还是没有什么教程,所以这里就来一点入门的,适合新手。 本文将基于第三篇的简单场景,打开和关闭控制器的显示。 系列博客: Unity OpenVR 虚拟现实入门一:安装配置 Unity + OpenVR 环境 Unity OpenVR 虚拟现实入门二:一个最简单的虚拟现实游戏/程序 Unity OpenV...

Unity OpenVR 虚拟现实入门五:通过传送控制玩家移动

在 Unity 的帮助下,虚拟现实应用的开发非常容易。不过国内竟然还是没有什么教程,所以这里就来一点入门的,适合新手。 本文将基于第四篇的简单场景,通过传送的方式控制玩家移动。 系列博客: Unity OpenVR 虚拟现实入门一:安装配置 Unity + OpenVR 环境 Unity OpenVR 虚拟现实入门二:一个最简单的虚拟现实游戏/程序 Unity Ope...

Unity OpenVR 虚拟现实入门二:一个最简单的虚拟现实游戏/程序

在 Unity 的帮助下,虚拟现实应用的开发非常容易。不过国内竟然还是没有什么教程,所以这里就来一点入门的,适合新手。 本文将开发一个最简单的虚拟现实应用。 系列博客: Unity OpenVR 虚拟现实入门一:安装配置 Unity + OpenVR 环境 Unity OpenVR 虚拟现实入门二:一个最简单的虚拟现实游戏/程序 Unity OpenVR 虚拟现实入门...

Unity OpenVR 虚拟现实入门三:最简单的五指交互

在 Unity 的帮助下,虚拟现实应用的开发非常容易。不过国内竟然还是没有什么教程,所以这里就来一点入门的,适合新手。 本文将基于前两篇搭建的环境,做一个简单的五指交互。 系列博客: Unity OpenVR 虚拟现实入门一:安装配置 Unity + OpenVR 环境 Unity OpenVR 虚拟现实入门二:一个最简单的虚拟现实游戏/程序 Unity OpenVR...

Unity OpenVR 虚拟现实入门一:安装配置 Unity + OpenVR 环境

在 Unity 的帮助下,虚拟现实应用的开发非常容易。不过国内竟然还是没有什么教程,所以这里就来一点入门的,适合新手。 本文将搭建好虚拟现实的开发环境。 系列博客: Unity OpenVR 虚拟现实入门一:安装配置 Unity + OpenVR 环境 Unity OpenVR 虚拟现实入门二:一个最简单的虚拟现实游戏/程序 Unity OpenVR 虚拟现实入门三:...

WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)

在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None"、AllowsTransparency="True" 这两个属性。如果不想自定义窗口样式,还需要设置 Background="Transparent"。这样的设置会让窗口变成 Layered Window,WPF 在这种类型窗口上的渲染性能是非常糟糕的。 本文介绍如何使用 WindowChr...

Windows 下的高 DPI 应用开发(UWP / WPF / Windows Forms / Win32)

本文将介绍 Windows 系统中高 DPI 开发的基础知识。由于涉及到坐标转换,这种转换经常发生在计算的不知不觉中;所以无论你使用哪种 Windows 下的 UI 框架进行开发,你都需要了解这些内容,以免不断踩坑。 各种不同的 Windows 桌面 UI 框架 微软主推的 Windows 桌面 UI 框架有: UWP WPF Windows Forms ...

适合 .NET 开发者用的 GitHub Actions(时不时更新)

本文制作并长期更新适合 .NET 开发者用的 GitHub Actions。整理方式为整个文件而不是单个可用的模块,这样可以方便大家以最快的速度为自己的项目添加 GitHub Actions。当然自己改改也可。 .NET 编译与单元测试(全平台) 功能:编译你的 .NET 项目,并进行单元测试。 适用:如果你的项目是纯 .NET 项目,无论项目是 .NET Core 还是 .N...

使用 Xamarin 在 iOS 真机上部署应用进行调试

虽然 Xamarin 可以在 Windows 操作系统上编写和调试,但如果开发 iOS 应用,那么我们依然需要一台安装有 XCode 和 Visual Studio for Mac 的 Mac 电脑。做真机部署不是像平时使用太阳系第一 IDE Visual Studio 那样方便。 所以本文需要介绍如何使用 Xamarin 在 iOS 真机上部署应用进行调试,然后顺便说一些注意事项。 ...