当前位置: 首页 > news >正文

预编译框架,开发高性能应用 - 课程 - 微软技术暨生态大会 2018

微软技术暨生态大会(Tech Summit),2018 年在上海世博中心召开。这是最后一次的 Tech Summit 了;明年开始,中国大陆地区就要和其他国家和地区一样,进行全球 Ignite Tour 了。

我也有幸成为分会场讲师团队的一员,课程是《预编译框架 - 开发高性能应用》。内容就是我博客中与 MSBuild / Roslyn / dotnet / NuGet 相关的内容;我们将利用这些知识打造一个高性能客户端应用。


微软技术暨生态大会

进入 微软技术暨生态大会 官网可以了解更多内容。如果你和我一样对微软技术富有热情,那么也欢迎你 买票 一起去上海。

关于课程《预编译框架 - 开发高性能应用》

利用 Roslyn 在编译期间提前完成收集和修改所需的各种信息,我们能将 .NET 的反射耗时降低到近乎为 0!
当前大多数的框架都离不开反射的支持,但是 .NET 的反射很伤性能,而不用反射又很难支撑大型应用;基于 Roslyn 的预编译框架旨在解决这些性能问题。

本次讲题能学到什么?

  1. 体验预编译框架的强大性能
  2. 理解 dotnet build 的编译过程
  3. 使用 Roslyn 分析和修改项目源代码
  4. 如何开发自己的预编译框架
  5. 制作源代码引用 NuGet 包(而不是 dll 引用 NuGet 包)

其实此课程的计划课程内容有 2.5 小时,毕竟博客都有好几十篇了呢。算上跟我一起研究这项技术的 林德熙的与 Roslyn 相关的博客,那就更多了,而且还在持续增加中。

不过实际分会场课程中内容众多,留给每个讲师的时间只有 20 分钟或者 45 分钟。我有幸获得了 45 分钟时长的课程,所以虽然已经算长的了,却也必须减少和压缩课程内容。

于是,实际课程会以入门为主,进阶内容将作为资料线下学习。注意:即便是“入门”,难度也依然是 300(难度范围为 0-400),所以你必须拥有一定的 .NET 开发知识和一些应用开发经验才会理解课程内容。如果你的经验更偏客户端应用开发,那么更能体会本课程内容的目的。

课程大纲

课程大纲是为 2 小时的课程而设计的。所以实际上我只会讲大部分内容,以下所有动手实验和演示的地方都会略过,代之以提前运行和编写的结果。

实际课程中会略过的部分以斜体表示

  • 引入
    • 一批性能数据
      • 收集:反射 VS 配置文件 VS 预编译
      • 调用:直接调用 VS 最快反射 VS 预编译
      • 程序集个数:1 个 VS ……
  • 概览
    • 目录
      • 了解源码包 SourceYard 和预编译框架 SourceFusion
      • 学会编写编译期代码以提升应用性能
    • 预编译框架的原理
    • 多个 API 的展示
      • 源码包
      • 编译期类
      • 类模板
      • 扩展
  • 教学
    • 目标:学会使用编译期代码代替反射以提升应用的执行性能
    • 教学目录
      • 理解 dotnet build 的编译过程
        • 理解 csproj 文件格式
        • 理解编译过程
        • 理解 NuGet 打包原理
      • 动手实验:SourceYard 源码包简化版
        • 编译期间执行一个 exe 程序
        • 在 exe 程序中接收参数并干预编译结果
      • 学习使用 Roslyn 分析源代码
        • 语法可视化窗格
        • 分析 C# 语法树
        • 在编译期间执行代码
      • 动手实验:SourceFusion 预编译框架简化版
        • 在编译期间收集程序集中具有特定标记的所有类型
        • 生成代码以快速访问这些类型的特定方法
  • 回顾
    • 回顾 dotnet build 的编译过程和 Roslyn 分析源码
    • SourceYard 和 SourceFusion 的开源仓库,欢迎加入

关于讲师 —— 吕毅

你可以进入 微软技术暨生态大会 - 大会日程 页面,然后点击 “演讲嘉宾”。

演讲嘉宾

在这里,你可以看到主题演讲、分会场课程以及动手实验室的各位讲师,可以去了解每一位讲师以及他们的课程。当然,你也可以看到我。

讲师页面

欢迎你的加入

最后,欢迎你一起参加微软技术暨生态大会,我们一起去与微软大咖,各位微软 MVP,社区技术牛人交流技术。

  • 购票
  • 微软粉丝之夜报名(目前名额已满)

课程课件使用 希沃白板 5 制作,这是一款专门针对教学场景设计的互动课件工具。

希沃白板 5


相关链接

SourceYard 源码包

  • 将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样 - 吕毅
  • Roslyn 如何基于 Microsoft.NET.Sdk 制作源代码包 - 林德熙

SourceFusion 预编译框架

  • 理解 C# 项目 csproj 文件格式的本质和编译流程 - 吕毅
  • 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj - 吕毅
  • 新 csproj 对 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras - 吕毅
  • 如何使用 MSBuild Target(Exec)中的控制台输出 - 吕毅
  • 如何在 MSBuild Target(Exec)中报告编译错误和编译警告 - 吕毅
  • 在制作跨平台的 NuGet 工具包时,如何将工具(exe/dll)的所有依赖一并放入包中 - 吕毅
  • 如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target(附各种自带的 Task) - 吕毅
  • Roslyn 如何使用 MSBuild Copy 复制文件 - 林德熙
  • 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 - 吕毅
  • 解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程 - 吕毅
  • 帮助官方 NuGet 解掉 Bug,制作绝对不会传递依赖的 NuGet 包 - 吕毅
  • 项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - 吕毅
  • 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦) - 吕毅
  • 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - 吕毅
  • 如何创建一个基于命令行工具的跨平台的 NuGet 工具包 - 吕毅
  • Roslyn 通过 Target 修改编译的文件 - 林德熙
  • Roslyn 使用 WriteLinesToFile 解决参数过长无法传入 - 林德熙
  • Roslyn 如何在 Target 引用 xaml 防止文件没有编译 - 林德熙
  • Roslyn 通过 nuget 统一管理信息 - 林德熙
  • Roslyn 使用 Target 替换占位符方式生成 nuget 打包 - 林德熙
  • MSBuild/Roslyn 和 NuGet 的 100 个坑 - 吕毅
  • Roslyn 通过 Nuget 引用源代码 在 VS 智能提示正常但是无法编译 - 林德熙
  • 都是用 DllImport?有没有考虑过自己写一个 extern 方法? - 吕毅
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换 - 吕毅
  • Roslyn 入门:使用 Visual Studio 的语法可视化(Syntax Visualizer)窗格查看和了解代码的语法树 - 吕毅
  • Roslyn 静态分析 - 林德熙
  • Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码 - 吕毅
  • Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码 - 吕毅
  • Roslyn 语法树中的各种语法节点及每个节点的含义 - 吕毅
  • Roslyn 通过 Nuget 管理公司配置 - 林德熙
  • Roslyn 在项目文件使用条件判断 - 林德熙

更多 MSBuild / Roslyn / dotnet / NuGet 相关的知识

  • 理解 Roslyn 中的红绿树(Red-Green Trees) - 吕毅
  • Roslyn 的确定性构建 - 吕毅
  • Roslyn 节点的 Span 和 FullSpan 有什么区别 - 林德熙
  • Roslyn NameSyntax 的 ToString 和 ToFullString 的区别 - 林德熙
  • 自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference - 吕毅
  • 如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference) - 吕毅
  • 阻止某个 NuGet 包意外升级 - 吕毅
  • 语义版本号(Semantic Versioning) - 吕毅
  • 使用 MSBuild 响应文件 (rsp) 来指定 dotnet build 命令行编译时的大量参数 - 吕毅
  • Roslyn 使用 Directory.Build.props 管理多个项目配置 - 林德熙
  • Roslyn 使用 Directory.Build.props 文件定义编译 - 林德熙
  • 在 Visual Studio 的解决方案资源管理器中隐藏一些文件 - 吕毅
  • 使用链接共享 Visual Studio 中的代码文件 - 吕毅
  • 为 Visual Studio 使用通配符批量添加项目文件 - 吕毅
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序 - 吕毅
  • dotnet core 通过修改文件头的方式隐藏控制台窗口 - 林德熙
  • 使用 GitVersion 在编译或持续构建时自动使用语义版本号(Semantic Versioning) - 吕毅
  • Automatically increase the semantic version using GitVersion - 吕毅
  • Reading the Source Code of Microsoft.NET.Sdk, Writing the Creative Extension of Compiling - 吕毅

相关文章:

  • 将 UWP 中 CommandBar 的展开方向改为向下展开
  • .NET 中创建支持集合初始化器的类型
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!
  • WPF 中的 NameScope
  • Windows 下的高 DPI 应用开发(UWP / WPF / Windows Forms / Win32)
  • 技术、产品、交流、思考 - 微软技术暨生态大会 2018
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
  • WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • 编写 Target 检测 MSBuild / dotnet build 此次编译是否是差量编译
  • 使用 Win2D 绘制带图片纹理的圆(或椭圆)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • es6(二):字符串的扩展
  • node入门
  • Spring Cloud中负载均衡器概览
  • SQLServer之创建显式事务
  • 第十八天-企业应用架构模式-基本模式
  • 多线程 start 和 run 方法到底有什么区别?
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 近期前端发展计划
  • 聚簇索引和非聚簇索引
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 你不可错过的前端面试题(一)
  • 批量截取pdf文件
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 通过git安装npm私有模块
  • 我的面试准备过程--容器(更新中)
  • 详解移动APP与web APP的区别
  • 学习JavaScript数据结构与算法 — 树
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 带你开发类似Pokemon Go的AR游戏
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ![CDATA[ ]] 是什么东东
  • #etcd#安装时出错
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • %check_box% in rails :coditions={:has_many , :through}
  • (阿里云万网)-域名注册购买实名流程
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot教学评价 毕业设计 641310
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四)汇编语言——简单程序
  • (算法)Game
  • (五)IO流之ByteArrayInput/OutputStream
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .jks文件(JAVA KeyStore)
  • .so文件(linux系统)
  • /etc/fstab和/etc/mtab的区别
  • /etc/shadow字段详解
  • @DataRedisTest测试redis从未如此丝滑
  • [Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例