摘要: 对 .NET 程序进行性能分析,dotTrace 能应对绝大多数的场景。在开启一个进程进行性能分析之前,我们会看到一些性能分析选项(Profiler Options)。本文将介绍这几个选项的含义,并用实际的例子来说明其用途。 本文内容 dotTrace 的性能分析选项 Sampling 采样 Tra 阅读全文
posted @ 2018-11-28 16:06 walterlv 阅读(611) 评论(0) 推荐(0) 编辑
摘要: 在做 UWP 应用开发的时候还有什么理由可以用到加速度计呢?场景很多啦,比如做游戏,做类似 Surface Hub 那种一边旋转,一边所有内容跟着一起转的效果。 Windows 10 UWP 中的加速度计使用非常简单,只需要简单几句代码即可。 本文内容 重力迷宫游戏 初始化 Acceleromete 阅读全文
posted @ 2018-11-28 15:54 walterlv 阅读(815) 评论(0) 推荐(0) 编辑
摘要: Win2D 是 DirectX 的一个高层封装,提供了极大 DirectX 性能的同时,又具有很好用的 API 设计。 用 Win2D 除了能做出高性能的视觉效果之外,还可以轻而易举地搭建一个游戏循环出来。使用 Win2D 的游戏循环,你可以直接做出一个简单的游戏出来。 本文内容 使用 Win2D 阅读全文
posted @ 2018-11-28 15:51 walterlv 阅读(629) 评论(0) 推荐(0) 编辑
摘要: 使用 Win2D 绘制图片和绘制椭圆都非常容易,可是如何使用 Win2D 绘制图片纹理的椭圆呢? 本文内容 重力迷宫小球 Win2D 实现 关于 CanvasCommandList 本文内容 重力迷宫小球 Win2D 实现 关于 CanvasCommandList 重力迷宫小球 Win2D 实现 关 阅读全文
posted @ 2018-11-28 15:49 walterlv 阅读(310) 评论(0) 推荐(0) 编辑
摘要: MSBuild 或 Roslyn 编译项目时均支持差量编译,毕竟为了性能。我在 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 一文中介绍了如何使一个 Target 支持差量编译。在那篇文章中我说到差量编译会导致 Target 不执行;也 阅读全文
posted @ 2018-11-28 15:47 walterlv 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 我们有很多种方法评估一个方法的执行耗时,比如使用性能分析工具,使用基准性能测试。不过传统的在代码中编写计时的方式依然有效,因为它可以生产环境或用户端得到真实环境下的执行耗时。 如果你希望在 .NET/C# 代码中编写计时,那么阅读本文可以获得一些建议。阅读本文也可以了解到 QueryPerforma 阅读全文
posted @ 2018-11-28 15:46 walterlv 阅读(1360) 评论(0) 推荐(0) 编辑
摘要: Windows Community Toolkit 再次更新到 5.0。以前可以在 WPF 中使用有限的 UWP 控件,而现在有了 WindowsXamlHost,则可以使用更多 UWP 原生控件了。 关于 Windows Community Toolkit 早期版本的 Xaml Bridge,可以 阅读全文
posted @ 2018-11-28 15:45 walterlv 阅读(1910) 评论(0) 推荐(0) 编辑
摘要: 在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项。不过,通常更有实际价值的是更复杂的 UWP 控件的引入,通常是一整个 Page。 本文将介绍如何在 阅读全文
posted @ 2018-11-28 15:37 walterlv 阅读(1731) 评论(0) 推荐(0) 编辑
摘要: 不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的。 本文就来说说这种不一样的写法。 本文内容 空的 try 块 受约束的执行区域(Constrained Execution Regions) 参考资料 本 阅读全文
posted @ 2018-11-28 15:33 walterlv 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能;这些问题却没有统一的描述。 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议。为了解决反射的性能问题,你可以遵循本文采用的各种方案。 本文内容 反射各方法的性能数据 反射的高性能开发建议 创建类型的实例 反射 阅读全文
posted @ 2018-11-05 10:34 walterlv 阅读(1281) 评论(0) 推荐(2) 编辑
摘要: 路 2018 年 10 月 23 日中午,我和林德熙踏上了前往上海的旅程。这是德熙第一次进行如此长途的旅行,之前几乎一直待在家里。 微软技术暨生态大会是从 10 月 25 日到 10 月 27 日,而 10 月 24 日是微软合作伙伴会议。我们当初在制定行程时,并没有意识到微软合作伙伴会议与微软技术 阅读全文
posted @ 2018-10-31 15:05 walterlv 阅读(253) 评论(0) 推荐(0) 编辑
摘要: Windows 10 自 1703 开始引入第二代的多屏 DPI 机制(PerMonitor V2),而 WPF 框架可以支持此第二代的多屏 DPI 机制。 本文将介绍 WPF 框架利用第二代多屏 DPI 机制进行高 DPI 适配的方法。同时,也介绍低版本的 WPF 或者低版本的操作系统下如何做兼容 阅读全文
posted @ 2018-10-28 18:35 walterlv 阅读(791) 评论(0) 推荐(0) 编辑
摘要: 本文将介绍 Windows 系统中高 DPI 开发的基础知识。由于涉及到坐标转换,这种转换经常发生在计算的不知不觉中;所以无论你使用哪种 Windows 下的 UI 框架进行开发,你都需要了解这些内容,以免不断踩坑。 <!-- ![Windows 高 DPI 应用开发课件](/static/post 阅读全文
posted @ 2018-10-28 16:51 walterlv 阅读(1379) 评论(0) 推荐(0) 编辑
摘要: 我们在 WPF 中使用绑定时可以使用 ElementName=Foo 这样的写法,并且还能够真的在运行时找到这个名称对应的对象,是因为 WPF 中提供了名称范围概念。 实现 INameScope 接口可以定义一个名称范围。无论你使用 Name 属性还是使用 x:Name 特性都可以在一个名称范围内指 阅读全文
posted @ 2018-10-28 13:01 walterlv 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 在 Binding 中使用 ElementName 司空见惯,没见它出过什么事儿。不过当你预见 ContextMenu,或者类似 Grid.Row / Grid.Column 这样的属性中设置的时候,ElementName 就不那么管用了。 本文将解决这个问题。 本文内容 以下代码是可以正常工作的 阅读全文
posted @ 2018-10-28 11:47 walterlv 阅读(473) 评论(0) 推荐(0) 编辑
摘要: .NET/C# 程序从 Main 函数开始执行,基本上各种书籍资料都是这么写的。不过,我们可以写多个 Main 函数,然后在项目文件中设置应该选择哪一个 Main 函数。 你可能会觉得这样没有什么用,不过如果你的应用程序在不同的编译条件下有不同的启动代码,或者你需要持续去大范围修改启动代码,那么做一 阅读全文
posted @ 2018-10-28 11:41 walterlv 阅读(1233) 评论(0) 推荐(1) 编辑
摘要: Task 自带有很多等待任务完成的方法,有的是实例方法,有的是静态方法。有的阻塞,有的不阻塞。不过带超时的方法只有一个,但它是阻塞的。 本文将介绍一个非阻塞的带超时的等待方法。 Task 已有的等待方法 Task 实例已经有的等待方法有这些: ▲ Task 实例的等待方法 一个支持取消,一个支持超时 阅读全文
posted @ 2018-10-28 11:32 walterlv 阅读(1073) 评论(0) 推荐(0) 编辑
摘要: 对象初始化器和集合初始化器只是语法糖,但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开,可读性会好一些。 本文将编写一个类型,可以使用集合初始化器构造这个类型。不只是添加元素的集合初始化器,还有带索引的集合初始化器。 稍微提一下对象初始化器 很普通的类型就可以支持对象 阅读全文
posted @ 2018-10-28 11:30 walterlv 阅读(396) 评论(0) 推荐(0) 编辑
摘要: 在 UWP 中使用 CommandBar 来迅速添加一组功能按钮是非常迅速的,是 UWP 中推荐的交互方案之一。也许你能见到 CommandBar 按你所需向下展开,不过可能更多数情况会看到 CommandBar 的展开方向是向上的。 本文将解释 CommandBar 的展开方向逻辑,并且提供多种方 阅读全文
posted @ 2018-10-28 11:14 walterlv 阅读(1412) 评论(0) 推荐(0) 编辑
摘要: 微软技术暨生态大会(Tech Summit),2018 年在上海世博中心召开。这是最后一次的 Tech Summit 了;明年开始,中国大陆地区就要和其他国家和地区一样,进行全球 Ignite Tour 了。 我也有幸成为分会场讲师团队的一员,课程是《预编译框架 - 开发高性能应用》。内容就是我博客 阅读全文
posted @ 2018-10-15 08:46 walterlv 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 在 UWP 中,可以通过给空间直接设置属性或在 Style 中设置属性来定制空间的样式;不过这样的样式定义十分有限,比如按钮按下时的样式就没法儿设置。当然可以通过修改 Template 来设置控件的样式,然而 UWP 中控件的样式代码实在是太多太复杂了,还不容易从 Blend 中复制了大量代码出来改 阅读全文
posted @ 2018-09-26 21:15 walterlv 阅读(266) 评论(0) 推荐(0) 编辑
摘要: ?? 操作符叫做 null-coalescing operator,即 null 合并运算符。如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。 在微软的官方 C# 文档中,此操作符被定义为不可重载。不过我们有方法可以间接实现这样的重载。 本文内容 运算符重载 编写 阅读全文
posted @ 2018-09-26 21:13 walterlv 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 今年五月的 Build 大会上,微软说 .NET Core 3.0 将带来 WPF / Windows Forms 这些桌面应用的支持。当然,是通过 Windows 兼容包(Windows Compatibility Pack)实现的。为了提前检查你的程序是否能在未来跑在 .NET Core 3.0 阅读全文
posted @ 2018-09-26 21:11 walterlv 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 如果你关注过命令行参数,也许发现有时你会在命令行参数的第一个参数中中看到应用程序的路径,有时又不会。那么什么情况下有路径呢? 其实是否有路径只是取决于获取命令行参数的时候用的是什么方法。而这是 Windows 操作系统的机制,与具体的运行环境无关。 本文内容 测试程序 解释 总结 本文内容 测试程序 阅读全文
posted @ 2018-09-26 21:09 walterlv 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 对于 WPF 程序,如果你有某一个 UI 控件非常复杂,很有可能会卡住主 UI,给用户软件很卡的感受。但如果此时能有一个加载动画,那么就不会感受到那么卡顿了。UI 的卡住不同于 IO 操作或者密集的 CPU 计算,WPF 中的 UI 卡顿时,我们几乎没有可以让 UI 响应的方式,因为 WPF 一个窗 阅读全文
posted @ 2018-09-26 21:04 walterlv 阅读(626) 评论(0) 推荐(0) 编辑
摘要: 使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性、方法等。然而,如果方法的参数中包含 ref 或 out 关键字的时候,又该怎么调用呢? 本文将介绍如何反射调用含 ref 或 out 关键字的方法。 比如我们有这样的类型: 那么反射的时候可以使用: 然而现在我们的函数是这样的,带一个 阅读全文
posted @ 2018-09-26 21:00 walterlv 阅读(1997) 评论(0) 推荐(1) 编辑
摘要: .NET 中提供了很多判断某个类型或实例是某个类的子类或某个接口的实现类的方法,然而这事情一旦牵扯到泛型就没那么省心了。 本文将提供判断泛型接口实现或泛型类型子类的方法。 本文内容 .NET 中没有自带的方法 我们需要自己编写方法 本文内容 .NET 中没有自带的方法 我们需要自己编写方法 .NET 阅读全文
posted @ 2018-09-26 20:59 walterlv 阅读(6536) 评论(0) 推荐(3) 编辑
摘要: 使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性、方法等。那么如何注册事件呢? 本文将介绍如何使用反射注册事件。 本文内容 不使用反射 使用反射 安全地使用反射 参考资料 本文内容 不使用反射 使用反射 安全地使用反射 参考资料 不使用反射 使用反射 安全地使用反射 参考资料 不使用反 阅读全文
posted @ 2018-09-26 20:58 walterlv 阅读(1305) 评论(0) 推荐(0) 编辑
摘要: 你做 .NET 开发的时候,一定用过 DllImport 这个特性吧,这货是用于 P/Invoke (Platform Invoke, 平台调用) 的。这种 DllImport 标记的方法都带有一个 extern 关键字。 那么有没有可能我们自己写一个自己的 extern 方法呢?答案是可以的。本文 阅读全文
posted @ 2018-09-09 10:10 walterlv 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 说到框架设计,打心底都会觉得很大很宽泛,而 API 设计是框架设计中的重要组成部分。相比于有很多大佬都认可的面向对象的六大原则、23 种常见的设计模式来说,API 设计确实缺少行业公认的原则或者说设计范式。 不过,没有公认不代表没有。无论是对外提供类库还是提供 url 形式的 API,为了使用者良好 阅读全文
posted @ 2018-09-07 08:58 walterlv 阅读(605) 评论(0) 推荐(0) 编辑