![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#
文章平均质量分 78
菜鸟爱飞不飞
软件攻城狮
展开
-
NX二次开发编译时dll自动数字签名及拷贝
在UG5.0开始,所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。原创 2023-02-16 18:00:50 · 1504 阅读 · 1 评论 -
Duende.IdentityServer——添加认证策略
上一章我们已经获取到了token,本文我们对webApi添加认证策略1、修改HostingExtensions.cs中的ConfigureServices方法添加如下代码//添加认证策略builder.Services.AddAuthorization(options =>{ //策略名称为ApiScope options.AddPolicy("ApiScope", policy => { policy.RequireAuthenticatedUs.原创 2022-03-15 11:24:54 · 920 阅读 · 0 评论 -
Duende.IdentityServer——快速开始
一、新建鉴权中心服务1、安装Duende.IdentityServer模板打开命令行工具,输入以下命令(若已安装,直接跳过)dotnet new --install Duende.IdentityServer.Templates2、新建 ROC.Identity.Center项目,框架选择.net 6打开vs 2022 新建解决方案命名为ROC.Identity.Center,选择Duende IdentityServer Empty(Duende Software)创建完成之后的项目结构原创 2022-03-15 11:20:56 · 5196 阅读 · 0 评论 -
.Net6+webApi 给swagger添加token
开发webApi 的时候,大多数情况会使用swagger调试接口,但是当api添加了权限认证注解的时候,就必须携带token才能访问,否则会返回401状态码提示无访问权限。解决办法有两种:(1)使用postman等调试工具携带token调试;(2)给swagger接口文档的请求头添加token。本文主要演示给swagger接口文档的请求头添加token。一、修改Program.cs将builder.Services.AddSwaggerGen()添加以下配置builder.Services.原创 2022-03-11 17:04:11 · 6044 阅读 · 0 评论 -
01-设计模式之单例模式
一、定义一个类只存在一个实例,并且该实例由单例类自己创建。二、特点只有一个实例必须由单例类自己创建实例必须提供一个全局访问点三、结构单例类:包含一个实例并可以自己创建实例的类当问类:使用单例的类四、实现1、实现(1) 单例类构造函数私有化(2)定义全局私有变量,类型为单例类(3)定义全局访问访问方法,方法中创建单例类的实例2、模式(1)线程安全饿汉式:单例类在程序加载的时候就已经创建了实例,访问类可以直接调用加锁机制:利用双重判断加锁的方式保证单线程创建实例原创 2022-03-07 16:37:35 · 221 阅读 · 0 评论 -
09-01 C#表达式目录树
目录一、定义二、与委托的区别1、在扩展方法表达式中的区别2、声明方式的区别3、执行的区别三、表达式目录树的本质一、定义表达式目录树是一种语法树,是一种数据结构二、与委托的区别1、在扩展方法表达式中的区别List<Person> persons = new Person().Query();persons.Where(p => p.Id == 1); // where扩展方法传入的是一个委托persons.AsQueryable().Where(p => p.Id原创 2021-02-06 17:37:23 · 813 阅读 · 0 评论 -
08-04 多线程之Task
目录前言一、Task开启线程的方式1、Task实例化2、Task.Run()静态方法3、TaskFactory二、Task由线程池管理三、父子线程前言Task诞生于.NETFramework 3.0,同时支持.NET CoreTask被称为C# 中多线程的最佳实现一、Task开启线程的方式1、Task实例化Task task = new Task(() =>{ Console.WriteLine($"==================new Task start {Th原创 2021-02-06 17:36:58 · 3655 阅读 · 0 评论 -
08-03 多线程之ThreadPool
目录前言一、池化思想(循环利用,节能减排)前言Thread功能虽然强大,但是不是很好用,有很多的缺点,如:框架不会去控制线程的数量,容易被滥用,造成服务器崩溃;所以在.net framework 2.0推出了线程池,是基于Thread做了升级后的产物一、池化思想(循环利用,节能减排)如果某个对象创建和销毁的代价比较高,同时这个对象还需要反复的使用,就需要一个池子保存多个这样的对象,需要的时候从池子里面取,用完之后放回池子,不用销毁(享元模式);可以做到节约资源提升性能,此外还能管控总的数量,防原创 2021-02-06 17:36:35 · 275 阅读 · 0 评论 -
Blazor Server中为Razor组件添加CSS隔离文件,样式不生效
前言Razor组件添加CSS隔离应当是使用最为简单,也是使用最为方便的一种CSS隔离方式。实现Razor组件间CSS隔离非常简单,只需要在组件所在的目录下建立同名的.razor.css文件即可——若文件夹A下存在名为Component.razor的组件,则只需要在文件夹A下建立Component.razor.css,即可实现为Component.razor组件设置单独的样式而不影响其他组件。组件CSS文件(Component.razor.css)将会被生成为“项目名.styles.css”的文件,在.N原创 2021-02-05 23:47:31 · 5815 阅读 · 0 评论 -
08-05 多线程之Task高级篇
目录一、Parallel1、推出时间2、控制线程数量二、多线程进阶1、多线程异常获取2、线程取消(1)全局变量法(2)CancellationTokenSource对象一、Parallel1、推出时间Parallel是.netframework 4.5版本推出Parallel 并发执行多个Action,多线程执行,线程id也不相同主线程参与计算,所以会阻塞主线程,卡顿界面相当于Task.WaitAll()/// <summary>/// .netframework 4.5版原创 2021-02-02 11:46:12 · 391 阅读 · 1 评论 -
08-02 多线程之Thread
目录一级目录二级目录三级目录一级目录二级目录三级目录原创 2021-02-02 11:45:53 · 177 阅读 · 0 评论 -
08-01 多线程之异步
目录一、进程与线程1、定义2、关系二、C# 中的多线程1、同步方法本质特点2、异步方法本质特点三、多线程进阶1、控制线程执行顺序2、获取线程返回值一、进程与线程1、定义进程:是系统进行资源分配和调度的一个独立单位,记录当前程序在运行的时候对各种资源的消耗,,是一个虚拟概念线程:线程是进程的实例,计算机在执行某个动作,一个最小的执行流,也是虚拟概念句柄:句柄其实就是一个数字,对应计算机程序中的最小单位,如:当前程序运行Id。2、关系一个进程包括多个线程二、C# 中的多线程Thread是原创 2021-02-02 11:45:33 · 376 阅读 · 0 评论 -
06-01 C# Lambda表达式的发展史
目录一、lambda在framework 1.0版本中的形态二、lambda在framework 2.0版本中的形态三、lambda在framework 3.0版本中的形态1、3.0初期版本中的形态2、3.0后期版本中的形态发展四、lambda表达式的本质五、本文代码前期准备:在类的内部定义几个委托和方法//先定义几个自定义委托public delegate void NoReturnNoPara();public delegate void NoReturnHasPara(int x, int y原创 2021-02-02 11:44:57 · 339 阅读 · 0 评论 -
07-03 C# Linq扩展方法和表达式
针对IEnumerable类型数据原创 2021-02-02 11:42:25 · 1401 阅读 · 0 评论 -
04-01 C# 委托的声明与实例化
目录一、委托的定义二、委托的声明1、声明委托2、在该类中定义方法,参数返回值与声明的委托对应3、委托的实例化与调用4、委托的本质三、委托的应用场景四、代码地址一、委托的定义将方法当作参数传递,就是委托。二、委托的声明委托类似于方法,可以有参数和返回值,但是没有方法体(但是委托的本质不是一个方法),需要用delegate修饰,可以在类的内部声明,也可以在类的外部声明。1、声明委托namespace Lanyp.Course.Delegate{ #region delegate out o原创 2021-02-02 11:42:01 · 896 阅读 · 0 评论 -
07-01 C# Linq的诞生
目录一、linq存在的意义二、linq诞生过程思考1、方案一:通过循环和if判断来筛选数据2、方案二:扩展方法(1)最初版本(2)进化版本(3)最终版本观察三、本文代码一、linq存在的意义linq的存在是为了对数据进行操作,诞生于dotnet framework 3.0。二、linq诞生过程思考现在有一个Person集合,我们需要根据不同的条件筛选出对应的人员,又哪些方案?1、方案一:通过循环和if判断来筛选数据缺点:代码量大,不够简洁,特别是遇到复杂条件之后,会很麻烦随着条件的变更,原创 2021-02-02 11:41:22 · 224 阅读 · 0 评论 -
07-02 C# linq高级实现
目录一、接口实现Where扩展二、yield 迭代器关键字对比一、接口实现Where扩展上一章我们最终得到的where扩展方法实现如图,但是还是有缺点:只支持List调用改扩展方法,那么能不能让它更加灵活呢?当然可以:可以通过IEnumerable接口来扩展,这样做的好处:通过接口来扩展,只要实现了这个接口的,都可以使用这个扩展(如List,HashSet等)扩展性更好,更加通用/// <summary>/// /// 将原来的List<T>改为IEnumera原创 2021-02-02 11:40:43 · 294 阅读 · 0 评论 -
06-02 C# 匿名类
目录一、诞生二、普通类的实例化三、object匿名类1、优点2、缺点3、思考四、动态类型匿名类1、优点2、缺点3、思考五、弱类型(不确定类型)匿名类1、优点2、缺点3、思考4、使用场景六、本文代码一、诞生framework 3.0版本开始支持匿名类二、普通类的实例化普通类型实例化之后,可以访问其中的属性和方法/// <summary>/// 普通类/// </summary>public void InstacePerson(){ Console.Write原创 2021-02-02 11:40:10 · 1939 阅读 · 0 评论 -
06-03 C# 扩展方法
目录一、思考1、普通方式优点缺点2、借助第三方对象优点缺点3、扩展方法定义优点二、注意事项1、实例方法的优先级高于扩展方法2、不要扩展object或者没有约束的泛型三、本文代码一、思考我现在有一个类,里面有一个方法,代码如下,如果我想在给这个类新增一个方法,有哪些方案?public class Person{ public int Id { get; set; } public string Name { get; set; } public void Hello()原创 2021-02-02 11:39:25 · 148 阅读 · 0 评论 -
02-14 docker 部署.net core web应用
目录一、创建项目二、添加Dockerfile三、发布程序四、构建镜像五、创建容器六、访问一、创建项目创建项目过程不在赘述(不知道请自行百度)二、添加Dockerfile修改Dockerfile# 基于.net 5 FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base# 创建镜像工作目录WORKDIR /app# 所有文件从宿主publish目录复制到镜像app目录COPY . .# 执行dotnet run L原创 2021-01-27 14:37:12 · 281 阅读 · 0 评论 -
dotnet core 项目publish之后执行dotnet run “找不到要运行的项目”
原因:dotnet run命令用于项目的上下文中,而不是构建的程序集。如果您尝试运行依赖于框架的应用程序dll,则必须使用dotnet而不使用命令。解决dotnet xxxxxxxx.dll原创 2021-01-27 12:20:54 · 4282 阅读 · 0 评论 -
01-02 Electron + dotnet 5 Blazor + ElectronNET.API桌面应用打包为exe安装包
目录一、下载软件二、压缩项目文件三、构建项目三级目录一、下载软件下载并安装NSIS 和 HM NIS Edit,这两个软件是配合使用的,不安装NSIS就无法选择语言,所以先安装NSIS 再安装HM NIS Edit,使用过程中只需要操作HM NIS Edit。二、压缩项目文件(1)如果没有安装asar,请先安装npm install -g asar(2)在项目根目录下运行asar pack ./ app.asar(3)将生成的文件app.asar放到程序目录~\obj\Host\node_m原创 2021-01-23 17:12:22 · 1246 阅读 · 0 评论 -
01-01 Electron + dotnet 5 Blazor + ElectronNET.API创建桌面程序
目录前言一、开发环境二、创建项目三、启动项目四、最终效果前言随着.net core 的发布,C# 实现了跨平台,但是截至2021年1月22日,基于.net core构建的桌面程序如WPF,WinForm还是无法实现跨平台运行,所以可以构建web项目结合Electron来构可以跨平台运行的桌面程序,本文使用Electron结合Blazor App和Electron.NET类库构建桌面应用。一、开发环境1、安装Node.js2、切换淘宝镜像源npm config set registry htt原创 2021-01-23 00:43:48 · 1968 阅读 · 7 评论 -
DevExpress BackstageViewControl控件 Placement属性探究(WPF)
目录一、前言二、遇到的问题三、如何解决1、问题一:(1)设置`DockLayoutManager`控件的如下属性(2)设置`LayoutPanel`的属性2、问题二:其实有两种思路思路一:(不推荐)思路二:(推荐)四、最终效果一、前言最近公司在做工具集成,就是将第三方工具嵌入到我们自己开发的客户端中,工具嵌入的思路大概是先打开第三方工具,然后找到该工具的句柄,最后固定在WPF窗口的固定位置,但是这样会产生一个问题,就是WPF窗口中的左右控件都不能有浮动的效果,否则第三方工具的窗口就会遮挡WPF控件显示原创 2020-12-20 12:36:02 · 1210 阅读 · 0 评论 -
为什么使用ThreadPool.SetMaxThreads设置线程池最大线程数却不起作用?
一、场景复现通过ThreadPool.SetMaxThreads设置最大线程数是15,通过循环20次分配线程,理论上不管循环多少次,最多只能分配15个线程,但是现在分配了20个,是怎么回事?1、代码:{ ThreadPool.SetMaxThreads(15, 15); //设置最大线程数为15个 ManualResetEvent manualResetEvent = new ManualResetEvent(false); //循环开启线程 for (int i = 0; i &l原创 2020-09-25 02:01:35 · 7624 阅读 · 7 评论