dotnet
文章平均质量分 88
walter lv
这个作者很懒,什么都没留下…
展开
-
在制作多框架项目的 NuGet 包时应该注意的问题(buildMultiTargeting TargetFrameworks)
制作一个 dll 引用的 NuGet 包简直是一键完成,无论是不是多框架项目;制作 dotnet-tools 也是如此。但如果需要自定义一些编译步骤,那么就需要在制作 NuGet 包时做很多的特殊处理了。本文介绍制作适用于多框架项目的 NuGet 工具包时应该注意的问题。本文内容背景知识NuGet 包内的文件夹结构制作有自定义功能的 NuGet 包执行时机1. 仅含 `build` 文件夹的 NuGet 包装到单框架项目中2. 仅含 `build` 文件夹的 NuGet 包装到多框架项目中3. 包含原创 2020-06-30 10:03:02 · 2954 阅读 · 0 评论 -
适合 .NET 开发者用的 GitHub Actions(时不时更新)
本文制作并长期更新适合 .NET 开发者用的 GitHub Actions。整理方式为整个文件而不是单个可用的模块,这样可以方便大家以最快的速度为自己的项目添加 GitHub Actions。当然自己改改也可。本文内容.NET 编译与单元测试(全平台).NET 编译与单元测试(仅限 Windows 系统下的编译)NuGet Push自带环境.NET 编译与单元测试(全平台)功能:编译你的 .NET 项目,并进行单元测试。适用:如果你的项目是纯 .NET 项目,无论项目是 .NET Core 还是原创 2020-06-30 09:58:39 · 1194 阅读 · 0 评论 -
Unity3D 入门:如何制作天空效果?天空盒的使用
在 Unity 编辑器的主界面中我们可以很容易制作各种场景物体,但天空如何制作呢?本文内容了解和设置默认的天空盒在资源商店中下载天空盒总结了解和设置默认的天空盒在新建一个 Unity3D 项目之后,我们在空空如也的场景下看到的那蓝灰过渡的画面,其实就是 Unity3D 默认提供的“天空”,这个机制叫“天空盒”(Skybox)。你可以在 Window->Rendering->Lighting Settings(窗口->渲染->照明设置)中打开当前场景的照明设置,里面可以设置天原创 2020-06-30 09:50:23 · 12490 阅读 · 1 评论 -
Unity3D 入门:Unity Editor 编辑器常用快捷键
本文为 Unity3D 入门小伙伴整理 Unity 编辑器中的常用快捷键。本文内容调节工具视图调节窗口调整进入退出播放模式所有快捷键调节工具Unity 编辑器左上角的一组按钮,正好也对应着键盘左上角的字母:图标[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-17NMWB0q-1593478731245)(/static/posts/2020-05-05-17-29-17.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img原创 2020-06-30 08:59:22 · 2462 阅读 · 0 评论 -
.NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
Windows 下的路径分隔符是 \ 而 Linux 和 Mac 下的路径分隔符是 \。正常如果你的数据不跨 Windows 和 Linux 平台流通的话,不怎么会遇到多种换行符并存的问题的。但如果真发生了流通,那么如何将它们格式化为统一的当前平台认识的分隔符呢?本文内容现有方案没有原生方案(.NET)为什么 .NET 原生不做统一化?自己实现简单省事型高性能型如何避免现有方案没有原生方案(.NET)System.IO.Path 带了一堆方法用来处理路径。各大文档博客和书籍也都推荐大家使用 Pat原创 2020-06-30 08:55:20 · 608 阅读 · 0 评论 -
.NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
垃圾回收机制有一些未定义部分,一般来说不要依赖于这些未定义部分编程,否则容易出现一些诡异的 bug 或者不稳定的现象。本文介绍局部变量这部分的细节,而这点在 .NET Framework 和 .NET Core 默认情况下的表现有差别。本文内容问题代码原因问题代码看看下面这段代码,你觉得会输出 Foo is collected 吗?class Program{ static void Main(string[] args) { new WeakReference原创 2020-06-30 08:53:49 · 1043 阅读 · 1 评论 -
.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
获取图片宽高的方法有很多种,本文介绍 .NET 中获取图片宽高的几种方法并评估其性能。如果你打算对大量图片进行一些处理,本文可能有用。本文内容本文即将评估的方法`System.Drawing.Imaging.Metafile``System.Drawing.Bitmap``System.Windows.Media.Imaging.BitmapImage``System.Windows.Medi...原创 2020-04-30 11:59:43 · 1271 阅读 · 0 评论 -
如何设置 ASP.NET Core 程序监听的 IP 和端口
Web 服务需要配置监听的 IP 和端口才可以对外提供真正的服务。本文介绍如何设置 ASP.NET Core 程序监听的 IP 和端口。ASP.NET Core 程序默认集成了 Kestrel 服务器,可以直接对外提供 Web 服务。虽然可以直接提供服务,但通常建议使用反向代理服务器来间接提供服务。因此,本文建议的大多数设置监听 IP 和端口的方法都是“临时方法”,即那种“配置出来”的方法,而...原创 2020-04-30 11:55:41 · 4391 阅读 · 0 评论 -
为 ASP.NET Core 程序制作 URL 的 301/302 跳转
如果你有一些需要重定向网页 URL 的情况,可以返回 HTTP 状态码 301/302 告诉浏览器或者搜索引擎访问新的 URL。本文描述如何在 ASP.NET Core 中进行重定向。本文内容HTTP 状态码 301/302ASP.NET Core重定向中间件重定向小心缓存HTTP 状态码 301/302301 表示“Moved Permanently”,即永久移动。通过返回此状态码可以告...原创 2020-04-30 11:52:48 · 4774 阅读 · 0 评论 -
三种方法为 ASP.NET Core 对外服务添加 https 支持(kestrel / frp / nginx)
虽然使用 Visual Studio 创建 ASP.NET Core 程序的时候可以选择是否添加 https 支持,不过这种方式只添加了 localhost 的证书,只有本地访问时浏览器才会承认。真正对外公开服务的时候这样是绝对没法儿提供 https 服务的。本文介绍使用三种不同的方式添加 https 的支持,三种方法各有优劣,本文会进行比较并给出不同的适用场景。你自己选择就好。本文内容你需...原创 2020-04-30 11:52:10 · 1743 阅读 · 0 评论 -
使用 Kestrel 为你的 ASP.NET Core 服务添加 https 支持
Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。它内置集成在了 ASP.NET Core 项目模板中,所以编写和对外开放一个 Web 服务会非常简单。虽然不推荐直接使用 Kestrel 对外提供 Web 服务,但为了简单的话,临时使用也是非常不错的选择。Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。Kestrel 只...原创 2020-04-30 11:51:29 · 1758 阅读 · 0 评论 -
Win32 方法 CreateFile 中选择合适的文件打开模式(CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS, TRUNCATE_EXI
Windows 打开文件的 API 中提供了多种不同的文件打开方式。你可以根据你的业务场景选择适合你的文件打开方式。本文内容Windows API`dwCreationDisposition``CREATE_NEW``CREATE_ALWAYS``OPEN_EXISTING``OPEN_ALWAYS``TRUNCATE_EXISTING`Windows APIOpenFile 方法只能打开...原创 2020-04-30 11:50:29 · 2539 阅读 · 0 评论 -
.NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
.NET 中文件打开的 API File.Open 提供了多种不同的文件打开方式,这些方式大多数与 Windows 文件 API 中的模式是对应的,但也有一些 .NET 层面的判断以及名称的变化。在 .NET 层你可以选择适合你业务场景需要的文件打开方式。本文内容文件打开方式`FileMode``CreateNew``Create``Open``OpenOrCreate``Truncate``...原创 2020-04-30 11:49:27 · 1087 阅读 · 1 评论 -
WPF 中如何创建忽略 DPI 属性的图片
WPF 框架设计为与 DPI 无关,但你依然可能遇到 DPI 问题。尤其是 Image 控件显示的图片会根据图片 EXIF 中的 DPI 信息和屏幕 DPI 自动缩放图片。对于 UI 用图来说这是好事,但对于软件用户随便插入的图片来说就不是了——用户传入的图片可能是各种各样不统一的 DPI。因此这种 DPI 我们应该忽略。本文内容解决方法`DrawingImage`解决方法直接设置 Ima...原创 2020-04-30 11:48:31 · 482 阅读 · 0 评论 -
为什么不应该公开用来同步的加锁对象?为什么不应该 lock(this)/lock(string) 或者 lock 任何非私有对象?
如果你编写线程安全代码时为了省事儿直接 lock(this),或者早已听说不应该 lock(this),只是不知道原因,那么阅读本文可以帮助你了解原因。本文内容原因实例扩展lock 公开的属性lock 字符串lock 其他任何可能被其他对象获取的公开对象结论原因不应该 lock(this) 是因为你永远不知道别人会如何使用你的对象,永远不知道别人会在哪里加锁。于是稍不注意就可能死锁!实例...原创 2020-04-30 11:47:27 · 453 阅读 · 0 评论 -
为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?
非泛型版本的 ICollection 中有 IsSynchronized 属性和 SyncRoot 属性,这两个属性被用来设计成以线程安全的方式访问和修改集合。不过这个设计让线程安全的访问由集合的实现方转嫁到了调用方,导致要么很难实现,要么很难调用。虽然泛型版本的 ICollection<T> 已经改进了设计,不再引入 SyncRoot 这样的属性到接口中,但如果我们在某些场景下需要...原创 2020-04-30 11:46:40 · 768 阅读 · 0 评论 -
.NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
在解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。。其原因是所解压的文件并非 zip 文件。本文内容异常原因异常在解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。 在 System.IO.Compression.ZipArchive.Read...原创 2020-04-30 11:45:48 · 10130 阅读 · 0 评论 -
如何在旧版本的 .NET Core / Framework 中使用 C# 8 的异步流(IAsyncDisposable / IAsyncEnumerable / IAsyncEnumerator)
C# 8.0 为我们带来了异步流,可以使用 async foreach,不过使用此语法需要 IAsyncEnumerable / IAsyncEnumerator 类型。本文介绍如何在旧版本的 .NET Framework 和旧版本的 .NET Core 中获得此类型。本文内容异步流所需版本安装 Microsoft.Bcl.AsyncInterfaces使用异步流定义支持异步流的方法使用 aw...原创 2020-04-30 11:44:56 · 1071 阅读 · 0 评论 -
为 .NET 各种开发工具设置网络代理,提升在大陆的网络性能
git、nuget、scoop 如何设置网络代理提升网络访问速度呢?本文内容git使用命令行设置直接修改配置文件使用 TortoiseGit 设置NuGet在命令行中设置直接修改配置文件Scoop在下面的博客正文中,都假设我的本机搭设了代理服务,其中 SOCKS5 代理服务的端口号是 7777,HTTP 代理服务的端口号是 7778。git使用命令行设置git 支持设置 http 代理...原创 2020-04-30 11:43:33 · 755 阅读 · 0 评论 -
.NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试。然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误。这似乎是一个矛盾的要求。然而最终我想到了一个办法:让重试一直进行下去,谁需要关心异常谁就去 catch 异常,不需要关心异常的模块则跟着一直重试直到成功。我们通过编写一个自己的 Awaiter 来实现,本文将说明其思路和最终实现的代码。本文内容Awaite...原创 2020-03-31 07:57:50 · 494 阅读 · 1 评论 -
了解 .NET/C# 程序集的加载时机,以便优化程序启动性能
林德熙在 C# 程序集数量对软件启动性能的影响 一文中说到程序集数量对程序启动性能的影响。在那篇文章中,我们得出结论,想同类数量的情况下,程序集的数量越多,程序启动越慢。额外的,不同的代码编写方式对程序集的加载性能也有影响。本文将介绍 .NET 中程序集的加载时机,了解这个时机能够对启动期间程序集的加载性能带来帮助。本文内容程序集加载方式对性能的影响程序集的加载时机程序集加载方式对性能的影...原创 2020-03-31 07:50:13 · 707 阅读 · 0 评论 -
用 dotTrace 进行性能分析时,Timeline 打不开?无法启动进程?也许你需要先开启系统性能计数器的访问权限
对 .NET 程序使用 dotTrace 进行性能分析时,你也可能遭遇到 dotTrace 的 Bug。我就遇到了性能分析选项 Timeline 打不开进程的情况。本文内容dotTrace 的性能分析选项Timeline 打不开?解决方法启动“计算机管理”配置性能监视器用户组添加自己作为用户组的成员你已经完成了dotTrace 的性能分析选项dotTrace 启动性能分析的选项有四个,你可...原创 2020-03-31 07:49:05 · 867 阅读 · 0 评论 -
在 Visual Studio 中使用 EditorConfig 统一代码风格(含原生与插件)
EditorConfig 是一种被各种编辑器广泛支持的配置,使用此配置有助于项目在整个团队中保持一致的代码风格。Visual Studio 2017 开始原生支持 EditorConfig。本文将介绍 Visual Studio 对 EditorConfig 的支持情况(含原生与插件),并给出符合 .NET 和 C# 约定的 EditorConfig 详细设置。本文内容EditorConfi...原创 2020-03-31 07:46:39 · 2964 阅读 · 0 评论 -
WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)
众所周知的,WPF 中多数对象都继承自 DispatcherObject,而 DispatcherObject 带给这些对象一个特点:不能跨线程访问。不过,WPF 中依然存在一些例外。本文将介绍 WPF 那些可跨线程访问的 DispatcherObject,如何充分利用这个特点提高应用程序的性能,以及如何自己编写这样的 DispatcherObject。本文内容什么样的 Dispatcher...原创 2020-03-31 07:43:35 · 578 阅读 · 0 评论 -
C#/.NET 中 Thread.Sleep(0), Task.Delay(0), Thread.Yield(), Task.Yield() 不同的执行效果和用法建议
在 C#/.NET 中,有 Thread.Sleep(0), Task.Delay(0), Thread.Yield(), Task.Yield() 中,有几种不同的让当前线程释放执行权的方法。他们的作用都是放弃当前线程当前的执行权,让其他线程得以调度。但是他们又不太一样。本文说说他们的原理区别和用法区别。本文内容原理区别Thread.Sleep(0)Thread.Yield()Thread...原创 2020-03-31 07:42:39 · 2354 阅读 · 1 评论 -
使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(概念篇)
OPML 全称是 Outline Processor Markup Language ,即 大纲处理标记语言。目前流行于收集博客的 RSS 源,便于用户转移自己的订阅项目。本文将介绍这个古老的格式,并提供一个 .NET 上的简易解析器。本文分为两个部分,一个是理解 OPML 格式,一个是解析此格式:概念篇(本文)解析篇本文内容OPML 格式典型的 OPML 文件OPML 文件中的节...原创 2020-02-29 14:23:03 · 3194 阅读 · 0 评论 -
使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(解析篇)
OPML 全称是 Outline Processor Markup Language ,即 大纲处理标记语言。目前流行于收集博客的 RSS 源,便于用户转移自己的订阅项目。本文将介绍这个古老的格式,并提供一个 .NET 上的简易解析器。本文是两个部分的第二篇,前者是理解 OPML 格式,此篇是解析此格式:概念篇解析篇(本文)本文内容OPML 格式创建适用于 RSS 的简易 OPML...原创 2020-02-29 14:22:27 · 2605 阅读 · 0 评论 -
UWP 中的各种文件路径(用户、缓存、漫游、安装……)
UWP 提供了多种不同文件路径访问方式,对应到不同的文件路径中。可能我们只是简单用 ApplicationData.Current 获取一下可以读写的路径便能应付我们应用日常所需的各种文件读写需求,不过,UWP 还提供了更多的路径选项。本文将和你一起总结 UWP 中的各种各样的路径。本文内容UWP 中的路径种类ApplicationDataPackage.InstalledLocation特...原创 2020-02-29 14:21:28 · 2899 阅读 · 0 评论 -
只有你能 new 出来!.NET 隐藏构造函数的 n 种方法(Builder Pattern / 构造器模式)
如果你给类写了一个公有构造函数,那么这个类就能被其他开发者 new 出来。如果你不想让他们 new 出来,把构造函数 private 就好了呀。然而还有更多奇怪的方式来隐藏你类的构造方法。为什么要隐藏构造函数?有些类型,只有组件的设计者才知道如何正确创建其类型的实例,多数开发者都无法正确将其创建出来。典型的如 string:绝大多数开发者都不能正确创建出 string 的实例,但通过写一...原创 2020-02-29 14:20:18 · 606 阅读 · 0 评论 -
使用 Postman 调试 ASP.NET Core 开发的 API
使用 ASP.NET Core 开发简单的后台 API 还是非常容易的。涉及到 GET 请求的调试我们可以用浏览器简单搞定,那么 POST/PUT/DELETE 这样的请求呢?本文将使用 Postman 来调试这些请求。本文内容简单的 ASP.NET Core 程序模拟 GET 请求下载安装 Postman模拟 POST 请求模拟 PUT / PATCH / DELETE / … 请求关于本...原创 2020-02-29 14:15:40 · 2147 阅读 · 0 评论 -
.NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
这里我想说的是类型“实例”的缓存,适用于那些实例或者值计算很耗时的操作。典型的场景如反射获取 Attribute。本文内容适用思路代码用法高性能创建对象高性能为属性赋值高性能“反射”调用函数附代码适用本文推荐的方法适用于相同的输入可以获得相同的输出,但是这个输入到输出的过程非常耗时。大家都知道反射是很耗时的,尤其是获取 Attribute 和反射调用实例的方法。而从一个反射的成员中得到其...原创 2020-02-29 14:12:19 · 893 阅读 · 0 评论 -
发布了一款库(或工具包),如何持续地编写更新日志(ChangeLog)?
据说程序员最讨厌的两件事是 “别人没有写文档” 和 “要我写文档”。编写更新日志可是也落入此怪圈呢!本文内容程序员不写文档自动化更新日志应该包含哪些内容手工和自动化的结合优秀文档的参考程序员不写文档来自 GitHub 的开源调查问卷结果直接显示,最令人头痛的莫过于文档了:Incomplete or outdated documentation is a pervasive probl...原创 2020-02-29 14:00:02 · 767 阅读 · 0 评论 -
使用 C# 代码创建快捷方式文件
快捷方式是一种特殊的文件,扩展名为 lnk。有很多种方式来创建快捷方式,不过使用 C# 代码创建一个却并不那么容易。本文分享三种不同的方式创建快捷方式。随处可用的代码这是最方便的方式了,因为这段代码随便放到一段代码中就能运行:/// <summary>/// 为当前正在运行的程序创建一个快捷方式。/// </summary>/// <param nam...原创 2020-02-29 13:58:38 · 1289 阅读 · 0 评论 -
.NET/C# 使窗口永不激活(No Activate 永不获得焦点)
有些窗口天生就是为了辅助其它程序而使用的,典型的如“输入法窗口”。这些窗口不希望抢夺其它窗口的焦点。有 Win32 方法来解决这样的问题,WS_EX_NOACTIVATE 便是关键。具体来说,是给窗口样式中额外添加一个 WS_EX_NOACTIVATE 位。var handle = GetTheWindowHandle();int exstyle = GetWindowLong(hand...原创 2020-02-29 13:48:57 · 1257 阅读 · 1 评论 -
使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名
在 .NET 程序中使用 Win32 函数并不如 C++ 中方便。因为 C# 中不能引入 C++ 中常用的头文件,于是各种方法签名、结构体定义等等都需要各种寻找。然而 PInvoke.net 帮助我们解决了这个问题。本文推荐一款 Visual Studio 插件来帮助我们更快速地插入 Win32 函数签名。本文内容PInvoke.net使用 PInvoke.net 扩展PInvoke.net...原创 2020-02-29 13:41:53 · 979 阅读 · 1 评论 -
如何在 .NET/C# 代码中安全地结束掉一个控制台应用程序?通过发送 Ctrl+C 信号来结束
我的电脑上每天会跑一大堆控制台程序,于是管理这些程序的运行就成了一个问题。或者说你可能也在考虑启动一个控制台程序来完成某些特定的任务。如果我们需要结束掉这个控制台程序怎么做呢?直接杀进程吗?这样很容易出问题。我正在使用的一个控制台程序会写文件,如果直接杀进程可能导致数据没能写入到文件。所以本文介绍如何使用 .NET/C# 代码向控制台程序发送 Ctrl+C 来安全地结束掉程序。本文内容用 C...原创 2020-01-28 17:56:00 · 4451 阅读 · 1 评论 -
.NET Standard 的管理策略
.NET Standard 作为各大 .NET 的标准,我们有必要了解一下它是如何在各种 .NET 的实现之间履行自己的职责的。所以,本文会说说它的管理策略。本文内容都有哪些 .NET Standard 的实现?标准在前还是实现在前?标准之内还是使用标准?并不一定都能实现的标准都有哪些 .NET Standard 的实现?目前 .NET Standard 的实现有这些:.NET Cor...原创 2020-01-28 17:53:34 · 395 阅读 · 0 评论 -
长期支持 LTS(Long-term Support)是怎样的一种支持方式
在 .NET Core 2.1 发布之时,微软称之为一个 LTS 版本,那么 LTS 的版本是一种怎样的版本呢?本文内容LTSLTSC / LTSBESRLTS这是 .NET Core 2.1 的发布博客:Announcing .NET Core 2.1 - .NET Blog;文中说:.NET Core 2.1 will be a long-term support (LTS) re...原创 2020-01-28 17:52:50 · 2855 阅读 · 0 评论 -
在 Visual Studio 的解决方案资源管理器中隐藏一些文件
项目文件中有一些属性几乎是专门为 IDE 而准备的,不过考虑到 .NET 生态的开发者多数都使用 Visual Studio,所以基本上也只有 Visual Studio 对这些特性支持的最全面。(才不会透漏这些属性其实本就是为 Visual Studio 而准备的呢。)本文将介绍如何在 Visual Studio 的解决方案资源管理器中隐藏一些文件。本文内容原生支持原生不支持变通解决活学活...原创 2020-01-28 17:47:02 · 3565 阅读 · 0 评论 -
解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程
在 csproj 中,Project 中的 Sdk 属性是 MSBuild 15.0 开始支持的,也就是 Visual Studio 2017 开始支持。有了 Sdk 属性的存在,MSBuild 编译过程能够扩展得非常强大,而不止是过去 Import 的一个 props 和 targets 文件。本文将介绍 Microsoft.NET.Sdk 的源码,以及利用源码中的一些线索来完成官方文档中没有...原创 2020-01-28 17:45:00 · 1095 阅读 · 0 评论