取消

在 Target 中获取项目引用的所有依赖(dll/NuGet/Project)的路径

在项目编译成 dll 之前,如何分析项目的所有依赖呢?可以在在项目的 Target 中去收集项目的依赖。 本文将说明如何在 Target 中收集项目依赖的所有 dll 的文件路径。 编写 Target <Target Name="WalterlvDemoTarget" BeforeTargets="CoreCompile"> <Message Text...

如何在命令行中监听用户输入文本的改变?

这真是一个诡异的需求。为什么我需要在命令行中得知用户输入文字的改变啊!实际上我希望实现的是:在命令行中输入一段文字,然后不断地将这段文字发往其他地方。 本文将介绍如何监听用户在命令行中输入文本的改变。 在命令行中输入有三种不同的方法: Console.Read() 用户可以一直输入,在用户输入回车之前,此方法都会一直阻塞。而一旦用户输入了回车,你后面的 ...

仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢?

平时我们获取一个程序集或者类型的 Attribute 是非常轻松的,只需要通过 GetCustomAttribute 方法就能拿到实例然后获取其中的值。但是,有时我们仅为反射加载一些程序集的时候,获取这些元数据就不那么简单了,因为我们没有加载目标程序集中的类型。 本文介绍如何为仅反射加载的程序集读取 Attribute 元数据信息。 仅反射加载一个程序集 使用 Reflecti...

使用 Visual Studio 自定义外部命令 (External Tools) 快速打开 git bash 等各种工具

Visual Studio 支持自定义的外部命令,于是即便 Visual Studio 原生没有的功能,插件没有提供的功能,你也能仅仅通过配置就实现。比如,我们可以一键打开 Git Bash 输入 git 命令,比如可以一键打开项目或者文件所在的文件夹。 本文将教你如何自定义 Visual Studio 的外部命令,并提供一些我自己正在使用的外部命令配置。 看,就是一键的按钮...

让你的 Windows 应用程序在任意路径也能够直接通过文件名执行

我们可以在任何路径下输入 explorer 来启动资源管理器,可以在任何路径中输入 git 来使用 git 相关的命令。我们知道可以通过将一个应用程序加入到环境变量中来获得这个效果,但是还有其他的方式吗? 我们将这个过程称之为向 Windows 注册一个应用程序路径。本文介绍向 Windows 注册一个应用程序路径的各种方法。 Windows 如何查找程序路径? 当我们在任意目...

编写 MSBuild 内联编译任务(Task)用于获取当前编译环境下的所有编译目标(Target)

我之前写过一些改变 MSBuild 编译过程的一些博客,包括利用 Microsoft.NET.Sdk 中各种自带的 Task 来执行各种各样的编译任务。更复杂的任务难以直接利用自带的 Task 实现,需要自己写 Task。 本文将编写一个内联的编译任务,获取当前编译环境下的所有编译目标(Target)。获取所有的这些 Target 对我们调试一些与 MSBuild 或编译相关的问题时可能带...

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

我之前写过一些改变 MSBuild 编译过程的一些博客,包括利用 Microsoft.NET.Sdk 中各种自带的 Task 来执行各种各样的编译任务。更复杂的任务难以直接利用自带的 Task 实现,需要自己写 Task。 本文介绍非常简单的 Task 的编写方式 —— 在 csproj 文件中写内联的 Task。 前置知识 在阅读本文之前,你至少需要懂得: cspro...

在 MSBuild 编译项目时阻止输出所有的警告信息

大型旧项目可能存在大量的 Warning,在编译之后 Visual Studio 会给出大量的警告。Visual Studio 中可以直接点掉警告,然而如果是通过命令行 msbuild 编译的,那如何不要让警告输出呢? 在使用 msbuild 命令编译项目的时候,如果存在大量的警告,输出量会非常多。如果我们使用 msbuild 命令编译来定位项目的编译错误,那么这些警告将会导致我们准确...

帮助官方 NuGet 解掉 Bug,制作绝对不会传递依赖的 NuGet 包

如果你希望做一个 NuGet 工具包,那么这个包一定不能作为依赖传递给下一个包。典型的例子,做一个生成版本号的工具 NuGet 包,或者做一个代码分析器。 本文将解决 NuGet 的几个坑,真正做到绝对没有的依赖传递。 我们遇到了什么问题 如果你使用了 GitVersion 这款 NuGet 包来自动修改你的版本号,那么你可能会遇到这个问题。GitTools/GitVersio...

电脑总是意外从睡眠状态唤醒,可以找出原因然后解决

在昏暗的夜晚,一个人躺在房间的床上,静静的思考着什么。突然间电脑屏幕亮了!什么鬼!到底是谁唤醒了我的电脑!!! 本文将介绍如何寻找唤醒电脑的真凶。 调查是谁唤醒了电脑 使用命令查看上一次是谁唤醒了电脑。 powercfg -lastwake 从图中可知上一次唤醒我计算机的是 英特尔® 以太网连接 I219-V 82186。 查看还有谁可以唤醒电脑 使用命令查看所有...

将友盟(cnzz)站点的访问数据报告分享给其他人

友盟(cnzz)可以帮助我们分析站点的访问数据。不过如果有更多的决策者,则需要更多人可以访问到友盟的数据。 本文介绍两种将自己站点的访问数据报告分享给其他人的方法。 首先,你必须有一个友盟产品的账号,如果还没有,去 注册吧! 使用查看密码分享 设置 进入 站点列表 页面。 点击网站右侧的“设置”。 然后进入查看密码标签,开启查看密码服务,然后输入查看密码。 这...

全局或为单独的项目添加自定义的 NuGet 源

本文介绍如何添加自定义的 NuGet 源。包括全局所有项目生效的 NuGet 源和仅在某些特定项目中生效的 NuGet 源。 你可以前往 我收集的各种公有 NuGet 源 以发现更多的 NuGet 源,然后使用本文的方法添加到你自己的配置中。 使用命令行添加 在使用命令行之前,你需要先在 https://www.nuget.org/downloads 下载最新的 nuget.e...

使用 Visual Studio 调试多进程的程序

当你的编写的是一个多进程的程序的时候,调试起来可能会比较困难,因为 Visual Studio 默认只会把你当前设置的启动项目的启动调试。 本文将介绍几种用 Visual Studio 调试多进程程序的方法,然后给出每种方法的适用条件和优劣。 Visual Studio 多启动项目(推荐) 在 Visual Studio 的解决方案上点击右键,属性。在公共属性节点中选择启动项目...

将 svn 仓库迁移到 git 仓库

我找到了一个很久很久以前编写的项目,然而当时是使用 svn 进行版本管理的。然而现在的版本管理全部是 git,不愿意再装一个 svn 工具来管理这些古老的项目,于是打算将其迁移到 git 中。 本文介绍如何将古老的 svn 项目迁移到 git。 找回 svn 仓库的 url 如果你能记得你 svn 仓库的 url,或者这个仓库是一个纯本地仓库,那么你直接复制这个 url 就好了...

.NET/C# 将一个命令行参数字符串转换为命令行参数数组 args

我们通常得到的命令行参数是一个字符串数组 string[] args,以至于很多的命令行解析库也是使用数组作为解析的参数来源。 然而如我我们得到了一整个命令行字符串呢?这个时候可能我们原有代码中用于解析命令行的库或者其他辅助函数不能用了。那么如何转换成数组呢? 在 Windows 系统中有函数 CommandLineToArgvW 可以直接将一个字符串转换为命令行参数数组,我们可以直...

git 合并策略

不清楚 git 冲突的表示方法,不了解 git 的合并原理,不知道 git 解冲突的多种策略。即便如此,大多数人依然可以正常使用 git 完成合并、拉取操作,并且解一些冲突。这得益于 git 默认情况下的合并方式可以处理大多数情况下的正常合并。 然而,你是否遭遇 git 自动合并炸掉的情况?命名提示没有冲突,代码却早已无法编译通过。 本文将介绍 git 的合并策略,你可能可以更好的使用不...

git 的合并原理(递归三路合并算法)

如果 git 只是一行行比较,然后把不同的行报成冲突,那么你在合并的时候可能会遇到大量的冲突;这显然不是一个好的版本管理工具。 本文介绍 git 合并分支的原理。 git 的冲突表示 例如我们有这样的三个提交 a、b、c。a、b 是在 master 上的其他修改,c 是我自己基于 master 上的 a 的修改。 现在,将 master 分支合并到我自己的 t/walterl...

将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样

NuGet 原本就提供了生成源码包的功能。不过,NuGet 原生的源码包仅用于调试时自带调试信息和调试源码。 本文将以最简单的方式制作一个源码引用包。安装 NuGet 包后,不会生成任何程序集引用,而是相当于将源码直接放入被安装的程序集中一样。 准备工作 我们需要一个可以用来打 NuGet 包的 .NET Core 项目,只需要在 Visual Studio 中新建一个即可。在...

ReSharper 在 C 盘占用了太多空间了,本文告诉你如何安全地删除或转移这些文件

一个不小心,我的 SSD 又满了。到底是谁占用了那么多的空间!如果你是 ReSharper 的重度用户,那么可能你的调查结果会直指 JetBrains ReSharper。 本文将告诉你如何安全地删除这些文件来释放你的 C 盘空间,然后在 ReSharper 中设置其他的缓存目录。 消失的 C 盘空间 SSD 很贵的,看看都满成什么样儿了……我一个 SSD 分成了 C 和 D ...

WPF's multi-threaded UI is not thread safe

WPF supports multiple UI threads in its framework. You can create multiple UI thread windows or create multiple UI threads in a single window. But unfortunately, this is not really thread-safe. Th...

WPF 支持的多线程 UI 并不是线程安全的

WPF 支持创建多个 UI 线程,跨窗口的或者窗口内的都是可以的;但是这个过程并不是线程安全的。 你有极低的概率会遇到 WPF 多线程 UI 的线程安全问题,说直接点就是崩溃。本文将讲述其线程安全问题。 简述这个线程安全问题 必要条件: 创建多个 WPF UI 线程 其实两个就够了,一个我们平时写的 App 类所在的主 UI 线程;一个后台 UI ...

.NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例

我们知道,在编译期间相同的字符串,在运行期间就会是相同的字符串实例。然而,如果编译期间存在字符串的运算,那么在运行期间是否是同一个实例呢? 只要编译期间能够完全确定的字符串,就会是同一个实例。 字符串在编译期间能确定的运算包括: A + B 即字符串的拼接 $"{A}" 即字符串的内插 字符串拼接 对于拼接,我们不需要运行便能知道是否是同一个实例: priva...

使用 Xamarin 开发 iOS 应用中需要注意的若干个问题

本文收集整理使用 Xamarin 开发 iOS 应用时可能会遇到的各种问题。 需要注册 Apple Developer Portal 不管你用什么开发 iOS 应用,成为一个 Apple 的开发者是必要的。 访问:https://developer.apple.com/register/ 登录 同意协议 完成!虽然简单,但是如果没有成为开发者,那么你在所有工具...

C# 永远不会返回的方法真的不会返回

一般情况下,如果一个方法声明了返回值,但是实际上在编写代码的时候没有返回,那么这个时候会出现编译错误。 然而,如果方法内部出现了永远也不会退出的死循环,那么这个时候就不会出现编译错误。 请看下面这一段代码,RunAndNeverReturns 方法声明了返回值 int 但实际上方法内部没有返回。这段代码是可以编译通过而且可以正常运行的。 namespace Walterlv.Dem...

CentOS 的终端中如何搜索文件

CentOS 中搜索文件可以使用 find 命令。 如果需要在当前文件夹中搜索文件,那么可以使用命令: ~$ find -name filename 其中 filename 是你需要找的文件或文件夹的名称。我们没有指定搜索文件的路径,默认是当前文件夹。 如果你希望在所有文件夹中查找,那么可以使用命令: ~$ find / -name filename 这里的 / 是根目录...

不使用 U 盘等任何工具全新安装 Windows 操作系统

安装 Windows 有非常多种方法,现在我们要解决的问题是: 手头没有量产的 U 盘,或者懒得花时间去用 iso 文件量产 U 盘; 不想在 Windows 现有系统下安装(可能是为了全新安装,也可能是为了跳过安装序列号/产品密钥) 于是本文教你如何一步一步在 Windows RE 环境下安装操作系统。 准备工作 Windows 10 的安装文件 ...

C#/.NET 如何确认一个路径是否是合法的文件路径

很多方法要求传入一个字符串作为文件名或者文件路径,不过方法在实际执行到使用文件名的时候才会真正使用到这个文件名;于是这这种时候才会因为各种各样的异常发现文件名或者文件路径是不合法的。 有没有方法能够提前验证文件名或者文件路径是否是合法的路径呢? 这是一个不幸的结论 —— 没有! 实际上由我们自己写代码判断一个字符串是否是一个合法的文件路径是非常困难的,因为: 不同操作系统的...

让 MSBuild Target 支持 Clean

我们有时候会使用解决方案的清理(Clean)功能来解决一些项目编译过程中非常诡异的问题。这通常是一些 Target 生成了一些错误的中间文件,但又不知道到底是哪里错了。 我们自己编写 Target 的时候,也可能会遇到这样的问题,所以让我们自己的 Target 也能支持 Clean 可以在遇到诡异问题的时候,用户可以自己通过清理解决方案来消除错误。 以下代码来自于 SourceFus...

出于迁移项目的考虑,GitHub 中 Fork 出来的项目,如何与原项目断开 Fork 关系?

如果需要为 GitHub 上的项目做贡献,我们通常会 Fork 到自己的名称空间下。在推送代码之后添加 pull request 时,GitHub 会自动为我们跨仓库建立 pull request 的连接,非常方便。但是,如果 Fork 是出于项目的迁移,例如从个人名下迁移到某个组织下或者反过来,那么这种自动的 pull request 的设置就很影响效率了。 那么这种情况如何处理呢?如何...

.NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)

如果你试图通过 GetHashCode 得到的一个哈希值来避免冲突,你可能要失望了。因为实际上 GetHashCode 得到的只是一个 Int32 的结果,而 Int32 只有 32 个 bit。 32 个 bit 的哈希,有多大概率是相同的呢?本文将计算其概率值。 对于 GetHashCode 得到的哈希值, 9292 个对象的哈希值冲突概率为 1%; 77163 个对...