本文来安利大家Obfuscar这个好用的基于MIT协议开源的混淆工具。这是一个非常老牌的混淆工具,从2014年就对外分发,如今已有累计495.5K的nuget下载量。而且此工具也在不断持续迭代更新,完全支持dotnet6版本,对WPF和WinForms等等的支持也是非常好,支持多个不同混淆方式和等级的配置,支持混淆之后生成符号文件。本文将来告诉大家如何使用此混淆工具,以及此工具能达成的效果和此工具混淆的原理开源此工具是由LexLi主导开发的,在GitHub上使用MIT最友好协议开源,开源地址是https://github.com/obfuscar/obfuscar使用方法此工具的使用方式有多个
在WPF里面,渲染可以从架构上划分为两层。上层是WPF框架的OnRender之类的函数,作用是收集应用程序渲染的命令。上层将收集到的应用程序绘制渲染的命令传给下层,下层是WPF的GFX层,作用是根据收到的渲染的命令绘制出界面。本文所聊的是渲染上层部分,在WPF框架是如何做到界面刷新渲染,包括此调用的顺序以及框架逻辑阅读本文之前,我期望读者有一定的WPF渲染基础,以及了解WPF的大架构。本文不会涉及到任何底层渲染相关的知识。阅读本文,你将了解到依赖属性和WPF渲染层之间的关系在开始之前,必须明确一点的是,不是所有的WPF应用行为,如依赖属性变更,都会触发渲染变更。有渲染变更不代表立刻将会触发界面
在WPF里面,渲染可以从架构上划分为两层。上层是WPF框架的OnRender之类的函数,作用是收集应用程序渲染的命令。上层将收集到的应用程序绘制渲染的命令传给下层,下层是WPF的GFX层,作用是根据收到的渲染的命令绘制出界面。本文所聊的是渲染上层部分,在WPF框架是如何做到界面刷新渲染,包括此调用的顺序以及框架逻辑阅读本文之前,我期望读者有一定的WPF渲染基础,以及了解WPF的大架构。本文不会涉及到任何底层渲染相关的知识。阅读本文,你将了解到依赖属性和WPF渲染层之间的关系在开始之前,必须明确一点的是,不是所有的WPF应用行为,如依赖属性变更,都会触发渲染变更。有渲染变更不代表立刻将会触发界面
本文将告诉大家如何在dotnet的控制台模式下,采用MAUI自绘库Microsoft.Maui.Graphics进行绘图,设置Microsoft.Maui.Graphics底层调用Microsoft.Maui.Graphics.Skia库的Skia进行具体的绘图实现,此控制台可以跨平台运行,我在本机Win10和WSL的Ubuntu上都运行过,输出的结果图片像素级相似。本文将告诉大家如何采用Microsoft.Maui.Graphics进行跨平台的自绘在开始之前,先理清一下概念。刚正式发布的MAUI指的是一个跨平台的UI框架,而dotnet指的是在UI框架下面的运行时,这是早已实现跨平台的了。本
本文将告诉大家如何在dotnet的控制台模式下,采用MAUI自绘库Microsoft.Maui.Graphics进行绘图,设置Microsoft.Maui.Graphics底层调用Microsoft.Maui.Graphics.Skia库的Skia进行具体的绘图实现,此控制台可以跨平台运行,我在本机Win10和WSL的Ubuntu上都运行过,输出的结果图片像素级相似。本文将告诉大家如何采用Microsoft.Maui.Graphics进行跨平台的自绘在开始之前,先理清一下概念。刚正式发布的MAUI指的是一个跨平台的UI框架,而dotnet指的是在UI框架下面的运行时,这是早已实现跨平台的了。本
本文是读伟民哥翻译的.NET内存管理宝典这本书的笔记,我认为读书的过程也需要实践,这样对一知半解的知识也有较为清晰的了解。在阅读到string在内存的布局时,我看到RuntimeHelpers的OffsetToStringData数据,据说此属性可以获取到字符串的字符在内存存放的实际地址,本文将来写一个混合C#和C++\CLI的应用来进行测试本文将完全采用.NET6进行编写,分别创建.NET6的C#控制台程序,和.NET6的C++\CLI空项目。这里需要稍微说明的是C++\CLI是通过C++编写的.NET应用程序,基于.NET运行时运行的程序在C++\CLI项目里面添加一个叫Foo的类,在类里
本文是读伟民哥翻译的.NET内存管理宝典这本书的笔记,我认为读书的过程也需要实践,这样对一知半解的知识也有较为清晰的了解。在阅读到string在内存的布局时,我看到RuntimeHelpers的OffsetToStringData数据,据说此属性可以获取到字符串的字符在内存存放的实际地址,本文将来写一个混合C#和C++\CLI的应用来进行测试本文将完全采用.NET6进行编写,分别创建.NET6的C#控制台程序,和.NET6的C++\CLI空项目。这里需要稍微说明的是C++\CLI是通过C++编写的.NET应用程序,基于.NET运行时运行的程序在C++\CLI项目里面添加一个叫Foo的类,在类里
本文记录一个开发和代码审查过程中,需要关注的细节。在dotnet里,在.NET6和以下版本,包括.NETFramework版本,使用NamedPipeClientStream进行连接管道服务,如果此时的管道服务没有存在,或者还没有启动,调用ConnectAsync或Connect方法,将会进入一个循环,不断进行空跑,等待超时或者是连接上。默认的ConnectAsync或Connect方法,传入的超时时间都是无穷,也就是将会无限重试,不断消耗CPU资源咱可以使用NamedPipeClientStream去连接一个管道服务,从而建立多进程之间的通讯。在连接时,最好是先有管道服务启动,然后再启动管道
本文记录一个开发和代码审查过程中,需要关注的细节。在dotnet里,在.NET6和以下版本,包括.NETFramework版本,使用NamedPipeClientStream进行连接管道服务,如果此时的管道服务没有存在,或者还没有启动,调用ConnectAsync或Connect方法,将会进入一个循环,不断进行空跑,等待超时或者是连接上。默认的ConnectAsync或Connect方法,传入的超时时间都是无穷,也就是将会无限重试,不断消耗CPU资源咱可以使用NamedPipeClientStream去连接一个管道服务,从而建立多进程之间的通讯。在连接时,最好是先有管道服务启动,然后再启动管道
我有用户给我报告一个内存不足的问题,经过了调查,找到了依然是使用已经被标记过时的HttpWebRequest进行文件推送,推送过程中,由于System.Net.RequestStream将会完全将推送的文件全部读取到内存,导致了在x86应用下,推送超过500MB的文件,基本上都会抛出OutOfMemoryException异常这是一个.NETCore和.NETFramework行为的差异。在.NETFramework下,调用WebRequest.Create方法创建一个HttpWebRequest对象,使用HttpWebRequest对象调用GetRequestStream方法即可获取请求的S