HueiFeng

Microsoft MVP

All Posts


.NET初探源代码生成(Source Generators)

前言 Source Generators顾名思义代码生成器,可进行创建编译时代码,也就是所谓的编译时元编程,这可让一些运行时映射的代码改为编译时,同样也加快了速度,我们可避免那种昂贵的开销,这是有价值的。 实现ISourceGenerator 集成ISourceGenerator接口,实现接口用于代码生成策略,它的生命周期由编译器控制,它可以在编译时创建时创建并且添加到编译中的代码,它为我们提供了编译时元编程,从而使我们对C#代码或者非C#源文件进行内部的检查。 [Generator] class CustomGenerator: ISourceGenerator { public void Initialize(GeneratorInitializationContext context) { throw …

.NET Core .NET

.NET探索模型路由约定实现伪静态

概述 IPageRouteModelConvention接口用于自定义PageRouteModel,这个对象在Microsoft.AspNetCore.Mvc.ApplicationModels命名空间中, 代表着Razor Page路由设置,换句话说我们可以通过实现该接口覆盖默认的实现。 该接口需要实现一个成员void Apply(PageRouteModel model)。通过这个方法,我们可以访问有关当前路由设置的元数据,并根据需要对其内容进行修改。 下面示例,将解决提供一个伪静态的解决方案,因此我们可以通过index.html about.html....去访问我们的页面,也就是说我们可以从Index-Index.html的支持 public class HtmlExtensionPageRouteModelConvention : …

.NET .NET5

.NET中使用DebuggerDisplay轻松定制调试

前言 对于调试的方式有多种,不过在今天我们将看到的监视窗口对变量的监视,当然在这里我们是定制内部的变量值,或者说变量的显示与计算的内容。 注:监视窗口在调试时可以一次显示多个变量。“快速监视”对话框一次显示一个变量。 file DebuggerDisplayAttribute 在下面示例中,我们在类上添加DebuggerDisplay,添加字符串:("Name={Name},Age={Age}"): class Program { static void Main(string[] args) { Student student = new Student() { Name = Mr.A, Age = 18 }; …

.NET Debugging

.NET探索平台条件编译

前言 今天偶然机会,翻了一下大学期间的书籍《C程序设计》,好吧,当我翻着翻着,翻到了符号常量(#define指令)中,是啊,这是一个预处理器指令,记得在Magicodes.IE中针对平台选择不同的库,哈哈,这是一个典型的根据平台进行条件处理,好吧, 根据这些内容,让我感觉在今天,我需要对#define指令以及在.NET中的平台条件处理,以及平台的条件编译进行记录一下。 file define 我们可通过define来定义符号,然后将符号用在#if指令表达式中,如下所示: #define PI 通过上面这些内容可能很难去了解这该如何使用,其实#define在我们的编码过程中也是很少去使用的,我们继续往下看。 其实对于预处理器,在我们调试以及运行时的作用是比较大的,比如说对某些代码限制编译,另一方变其实还可以对代码进行环境或者版本的控制,这些都是Ok的,最后我们结合着控制语句#if来看一下: …

.NET MSBuild

【Azure DevOps系列】Azure DevOps EFCore命令式脚本部署到SQL数据库

构建迁移脚本 为了构建迁移脚本,我们将需要使用EF Tools for Command Line Interface。这些工具在Microsoft.EntityFrameworkCore.Tools提供。 迁移脚本 现在我们将通过 dotnet ef migrations script –p path to your csproj with migrations -o $(Build.ArtifactStagingDirectory)\migrations\scripts.sql –i来迁移我们的脚本,在如下代码片段中我将脚本进行迁移出来并且输出到指定的路径 -o $(Build.ArtifactStagingDirectory)/migrations/scripts.sql中, -i代表生成可用于任何迁移的数据库的脚本。 - task: CmdLine@2 …

Azure DevOps

探索.NET平台中的SIMD内在函数Vector

概述 Vector(向量)是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而Vector刚好弥补了这个缺陷,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。 什么是SIMD? SIMD是Single Instruction Multiple Data的缩写,通常中文译为单指令多数据流,通俗来讲的话是:对多个数据执行同一个CPU指令,以达到平行运算的目的. 在GPU之前我们会通过CPU来运行该项技术来增加图片的运算速度,例如Intel的MMX、SSE、SSE2、AVX,AMD的3DNow!等等,都是来使用SIMD 为基础的概念,在GPU技术突飞猛进的今天,CPU的SIMD技术很少用在了图片运算方面了,更多的是在资料库或者其他用途上。 SIMD 它适用于机器 …

.NET .NET5

Vs编译时RazorTagHelper - DOTNET_HOST_PATH is not set

今天听朋友说遇到一个问题,打开一个aspnetcore2.2的项目工程,发现挺有意思,缺少环境变量DOTNET_HOST_PATH file 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4018 “RazorTagHelper”任务意外失败。 System.InvalidOperationException: DOTNET_HOST_PATH is not set 在 Microsoft.AspNetCore.Razor.Tasks.DotNetToolTask.get_DotNetPath() 在 Microsoft.AspNetCore.Razor.Tasks.DotNetToolTask.GenerateFullPathToTool() 在 Microsoft.Build.Utilities.ToolTask.ComputePathToTool() …

.NET Core

.NET必知的EventCounters性能指标监视器

在.NET我们对于性能指标监控,其实常见的有两个方法,一个是CLI工具dotnet-counters而另一个是代码级别的EventListener. 使用dotnet-counters dotnet-counters是一个性能指标监视工具,用于临时运行状态监视和初级性能调查。它可以观察通过 EventCounter API发布的性能计数器值。例如,可以快速监视 CPU 使用情况或 .NET Core 应用程序中引发的异常率,以了解在使用 PerfView 或 dotnet-trace 深入调查更严重的性能问题之前是否有任何可疑操作。 -- 摘自 dotnet-counters 命令 dotnet-counters collect dotnet-counters list dotnet-counters monitor dotnet-counters ps 安装dotnet- …

.NET Core .NET .NET5

Azure Storage Account 误删恢复

登陆Azure站点,导航到新支持请求工作流程中 file 新建一个支持请求,信息可以按照如下这么去设置,当然要注意订阅账号别选择错 file 点击图中圈起来的链接“恢复删除的存储帐户” file 请选择已删除的帐户, 并且单击恢复。 file 恢复完成后,我们会看到一个通知success~,恢复成功 file

Azure

【Azure DevOps系列】Azure DevOps多阶段构建

对于阶段的流水线其实是特别有用的,我们可以将构建、测试、或者说部署分为多个阶段进行处理。将您的应用程序部署到多个环境中,并从一个环境逐步过渡到另一个环境。例如,可以在CI中运行单元测试后自动部署到Dev环境,然后部署到运行集成测试的Test环境,然后手动部署到Production。 管道任务 这是一个最基础的管道任务,它在Microsoft托管代理上运行,同时他它采用ubuntu-16.04虚拟机镜像,执行后将会输出Hello world pool: vmImage: 'ubuntu-16.04' steps: - bash: echo Hello world 当然我们可以对此进行修改成如下方式: jobs: - job: myJob timeoutInMinutes: 10 pool: vmImage: 'ubuntu-16.04' steps: - …

ASP.NET Core Azure DevOps