取消

设置进程的 RedirectStandardOutput 重定向输出后,如果不将输出读出来,会卡死此进程

设置进程的 RedirectStandardOutput 重定向输出后,必须将其读出来。本文带你做一个实验并得出结论。 重定向输出 一个简单的尝试重定向输出的代码如下: using var process = new Process { StartInfo = new ProcessStartInfo("Walterlv.Demo.Output.exe") { ...

三种方法设置 .NET/C# 项目的编译顺序,而不影响项目之间的引用

当 A 项目引用 B 项目,那么使用 Visual Studio 或者 MSBuild 编译 A 项目之前就会确保 B 项目已经编译完毕。通常我们指定这种引用是因为 A 项目确实在运行期间需要 B 项目生成的程序集。 但是,现在 B 项目可能仅仅只是一个工具项目,或者说 A 项目编译之后的程序集并不需要 B,仅仅只是将 B 打到一个包中,那么我们其实需要的仅仅是 B 项目先编译而已。 本...

通过设置 sln 解决方案依赖,确保不引用的两个项目之间有明确的编译顺序

有时在编译解决方案的时候,希望两个项目有明确的编译顺序,而不是自动决定,或者在并行编译的时候同时编译。 本文介绍通过设置 sln 解决方案依赖来解决编译顺序问题。 设置解决方案级别的项目依赖 在解决方案上右键,然后选择“设置项目依赖”: 然后在弹出的项目依赖对话框中选择一个项目的依赖: 这时,如果看看解决方案文件(.sln)则可以看到多出了 ProjectDepen...

通过 ReferenceOutputAssembly=False 在引用项目时,不额外引入依赖文件

正常当两个 .NET 项目有引用的时候,会将一个的输出拷贝到另一个的输出目录下。但有时我们只是希望通过引用建立一个依赖关系而已,最终两个项目的输出是独立的。 通过本文的方法,你可以在 A 项目编译时,确保 B 项目已经编译,而无需引用 B。 ReferenceOutputAssembly=False 依然在项目中使用往常习惯的方法设置项目引用: 但是,在项目引用设置完成之...

.NET 程序集/项目/包的版本号设置有最大范围,最大不能超过 65534

试过给 .NET Core 项目设置一个大于 65535 的版本号吗?可能没有,因为设置了会炸! 最简问题项目 用最普通的项目模板创建一个 .NET 项目(要求是 SDK 风格的),于是,你会得到两个文件:项目文件 Walterlv.Demo.csproj 和代码文件 Class1.cs。 Walterlv.Demo.csproj: <Project Sdk="Micr...

Visual Studio 在编译 A 项目时,确保 B 项目已编译

如果考虑在你的某个项目中安插一个专门用来做编译的项目,这个项目要求最先编译,那么你会考虑用什么方法呢? 本文讲述在编译 A 项目时,确保 B 项目已编译的方法。 使用 MSBuild 编译目标来编译 A 在编译的时候,需要确保 B 项目已经编译(因为可能用到 B 的输出)。 然而 A 项目并不需要引用 B,因为仅仅是编译需要用到 B 而已,不需要在最终产品中带上 B。 那么...

理解 Visual Studio 解决方案文件格式(.sln)

一般情况下我们并不需要关心 Visual Studio 解决方案文件格式(.sln),因为 Visual Studio 对解决方案文件的自动修复能力是非常强的。但是如果遇到自动解冲突错误或者编译不通过了,那么此文件还是需要手工修改的。 本文介绍 Visual Studio 解决方案(.sln)文件的格式。 基本概念 Visual Studio 的解决方案文件由这三个部分组成: ...

从 “x is null 和 x == null” 的区别看 C# 7 模式匹配中常量和 null 的匹配

尝试过写 if (x is null)?它与 if (x == null) 相比,孰优孰劣呢? x is null 还有 x is constant 是 C# 7.0 中引入的模式匹配(Pattern Matching)中的一个小细节。阅读本文将了解 x is constant 和 x == constant 之间的差别,并给出一些代码编写建议。 🤓 C# 7 的模式匹配 ...

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

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

.NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑

一般来说,大家在需要监听全局消息的时候会考虑 SetWindowsHookEx 这个 API。或者需要处理一些非自己编写的窗口的消息循环的时候,也会考虑使用它。 如果要知道如何使用这个 API,你可以在网上搜到大量这样的文章/博客/教程/文档,然而大多不会提及使用此 API 时遇到的一些坑。阅读本文,你当然也可以知道应该如何使用这个 API,但同时也能了解如何正确使用以避免一些奇怪的问题。...

WPF / Windows Forms 检测窗口在哪个屏幕

使用 Windows Forms 自带的 System.Windows.Forms.Screen 类可以从一个窗口句柄获取到对应的屏幕。随后可以使用此 Screen 类获取各种屏幕信息。 System.Windows.Forms.Screen 通过句柄获取屏幕类: System.Windows.Forms.Screen.FromHandle(hWnd) 这里我做了一个 DE...

准确判断一个 WPF 控件 / UI 元素当前是否显示在屏幕内

你的 WPF 窗口是可以拖到屏幕外面去的,所以拉几个元素到屏幕外很正常。你的屏幕可能有多个。你的多个屏幕可能有不同的 DPI。你检测的元素可能带有旋转。 各种各样奇怪的因素可能影响你检查此元素是否在屏幕内,本文包你一次性解决,绝对准确判断。 本文将说三种不同的判定方法,分偷懒版、日常版和苛刻版: 如果你只是写个 demo 啥的,用偷懒版就够了,代码少性能高。 如果你在项目...

Compare four different file (folder) links on Windows (NTFS hard links, junction points, symbolic links, and well-known shortcuts)

It is well-known that mklink is a command to create a variety of links on NTFS disk. But if you don’t know much about it or even never hear of it, it doesn’t matter because you know shortcuts at le...

比较 Windows 上四种不同的文件(夹)链接方式(NTFS 的硬链接、目录联接、符号链接,和大家熟知的快捷方式)

可能有很多小伙伴已经知道通过 mklink 命令来创建 NTFS 磁盘上的各种链接;当然,就算不知道 mklink 的链接,快捷方式应该每个人都知道吧。mklink 的选项有很多种,但你可能在其他文章中难以找到对这些不同选项的不同效果和使用限制的准确和统一描述。本文将介绍 Windows 系统中所有的链接方式,它们的优缺点、使用条件和坑。 This post is written in...

支持 Windows 10 最新 PerMonitorV2 特性的 WPF 多屏高 DPI 应用开发

Windows 10 自 1703 开始引入第二代的多屏 DPI 机制(PerMonitor V2),而 WPF 框架可以支持此第二代的多屏 DPI 机制。 本文将介绍 WPF 框架利用第二代多屏 DPI 机制进行高 DPI 适配的方法。同时,也介绍低版本的 WPF 或者低版本的操作系统下如何做兼容。 添加应用程序清单文件 在你现有 WPF 项目的主项目中需要添加两个文件以支持...

VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstation

VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstation。有关更多详细信息,请访问 http://www.vmware.com/go/turnoff_CG_DG。 我在系统升级到 Windows 10 2004 后,启动 VMware 的任...

Visual Studio 智能感知提示里的奇妙行为一览

本文就是个吐槽,感兴趣一一去报给微软。 自动完成与建议完成 作为本文的背景,你可能需要了解 Visual Studio 有一个设置:“在建议完成模式和标准完成模式之间切换”。就是下面这个按钮,你可以在工具条上找到。 你一定很差异,看着这翻译,你知道“选中”对应“建议完成模式”还是“标准完成模式”呢?你知道什么是建议完成模式,什么是标准完成模式吗? 不要紧,这不是翻译的问题...

Chrome 窗口全黑了,不怕,有招

Chrome 的窗口偶尔会出现全黑掉的情况。从轻微的到严重的,本文都有解决方案。 偶然全黑 Chrome 全黑的状态看起来像下图这样: 通常发生在这些时间点后: 锁屏解锁后 突然间显卡驱动崩溃了一下 显卡驱动刚刚升完级 远程桌面连接后 这时,通常还伴随着基于 Chromium 内核的应用全部黑屏,比如: Visual Studio Code ...

拿别人的 Program Files 文件夹?别忘了考虑 x86/x64 路径

要拿适用于自己进程的 Program Files 文件夹很简单,无脑拿就好了。不过,如果涉及到拿其他程序的,那么就会涉及到与其他程序不同架构时路径不同的问题。 Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) 即可用来获取 Program Files 文件夹的路径。从 .NET Framework 4.0...

在 .NET 对象和 JSON 互相序列化的时候,枚举类型如何设置成字符串序列化,而不是整型?

默认情况下,Newtonsoft.Json 库序列化和反序列化 JSON 到 .NET 类型的时候,对于枚举值,使用的是整数。然而,在公开 JSON 格式的 API 时,整数会让 API 不易于理解,也不利于扩展和兼容。 那么,如何能使用字符串来序列化和反序列化 JSON 对象中的枚举呢? —— 使用转换器(JsonConverter)。 Newtonsoft.Json 中自带了一...

如何在保留原本所有样式/绑定和用户设置值的情况下,设置和还原 WPF 依赖项属性的值

WPF 备份某控件的一些属性,做一些神奇的操作,然后再还原这些属性。多么司空见惯的操作呀!然而怎么备份却是值得研究的问题。直接赋值?那一定是因为你没踩到一些坑。 场景和问题 现在,我们假想一个场景(为了编代码方便): 有一个窗口,设置了一些样式属性 现在需要将这个窗口设置为全屏,这要求修改一些原来的属性(WPF 自带那设置有 bug,我会另写一篇博客说明) 取消设...

Unity3D 入门:如何管理 Unity 项目中的 NuGet 包?使用第三方 NuGet 包管理器——NuGetForUnity

Unity 项目虽然可使用 C# 项目作为脚本,却并没有提供一种类似 NuGet 的第一方包管理器。不过,还是有第三方包管理器可以用,为 C# 脚本应用现有的库提供方便。 NuGetForUnity 第三方适用于 Unity 的 NuGet 包管理器推荐: GlitchEnzo/NuGetForUnity: A NuGet Package Manager for Unit...

Unity3D 入门:Unity 项目版本管理建议使用的 .gitignore 忽略文件和 .gitattributes 文件(2020年4月更新)

Unity3D 项目虽然说使用 C# 脚本开发,但毕竟不是 .NET/C# 项目。今天一位小伙伴告诉我说用错了 .gitignore 文件,结果管理仓库时丢了很多重要的文件。 实际上,GitHub 官方提供了大量不同项目类型的 .gitignore 文件,并且有广大的社区支持时时更新,直接前往 GitHub 官网下载是最好的选择了。 适用于 Unity 项目的 .gitignore ...

解决包含 GitHub Actions Workflow 的分支无法推送的问题

refusing to allow an OAuth App to create or update workflow {0} without workflow scope. GitHub 推送失败?试试本文方法。 问题 试图向 GitHub 推送一个分支的时候,出现错误 refusing to allow an OAuth App to create or update wo...

杂谈 System.Drawing.Common 的跨平台性(关键词:libgdiplus / .NET Core / Mono / Win32 / Linux / ……)

经过 Mono 团队的不懈努力,原本专属于 Win32 平台的 GDI+ 终于可以跨平台了,不过这中间还有好多的故事和好多的坑。 本文带你了解 System.Drawing 命名空间的跨平台。 System.Drawing、System.Drawing.Common 以及 GDI+ 在了解本文的后续内容之前,你可能需要先了解一些基本的名词,不然后面极可能看得云里雾里。 Sys...

微软官方的 NuGet 包是如何做到同时兼容新旧框架的?例如 System.ValueTuple 是如何做到在新旧版本的框架都能使用的?

不知你是否好奇,System.ValueTuple 是新框架(.NET Core 3.0)开始引入的类型,但可以通过 NuGet 包向旧框架提供这些类型的使用。并且,这些包即便安装到本来就有此类型的新框架上也能正常运行而不会出现多处类型定义的问题。 这些类型是如何做到框架内定义了,包里也定义了,却能像同一个类型一样作为参数和返回值传递?本文带你了解其中的奥秘。 示例项目 首先,...

Unity3D (Mono/IL2CPP) 中 P/Invoke 平台调用代码应该如何传委托

IL2CPP does not support marshaling delegates that point to instance methods to native code. 你可能平时在 .NET Core / Framework 的代码中写得很正常的托管代码的委托调用,在 Unity3D 中变得不可行。 本文举个例子,并且将其改正。 举例:查找所有可见窗口 本文的例...

Windows/Linux 系统中获取端口被哪个应用程序占用

管理服务程序的时候,可能会查询某个端口当前被哪个进程占用。不仅能找出有问题的进程将其处理掉,也可以用来辅助检查某个程序是否开启了服务并在监听端口。 Windows 系统 Windows 系统上可以使用 PowerShell 命令来查询占用某个端口的程序。 比如,我们需要查询 5000 端口被占用的进程是谁,可以在 PowerShell 中输入命令: Get-Process -...

如何在 Unity3D 场景中显示帧率(FPS)

本文介绍如何在 Unity3D 场景中显示帧率。 插入 UI:Text 做 FPS 帧率显示需要用到 UI 对象 Text,因此你需要有一个 Canvas。关于在 Unity3D 中插入 UI 对象的方法可见我的另一篇博客: Unity3D 入门:如何为游戏添加 UI - walterlv 当添加了 Canvas 后,再在 Canvas 里添加 Text: 设置...

Unity3D 入门:如何为游戏添加 UI

早期的 Unity3D 做 UI 并不容易,以至于大家习惯于使用 NGUI 插件来开发。后来 NGUI 的开发者加入开发了 Unity UI,现在就有了一套更好用的 Unity UI 可用了。 本文简单介绍如何添加 UI 作为入门,不会深入介绍各种 UI 和细节。 添加 Canvas Unity UI 都需要放到 Canvas 上才能工作。你可以像如下图这样插入一个 Canva...