使用 Magick.NET 在 .NET 程序中读取AVIF、HEIC、WEBP图片
随着科技的进步,越来越多新的、更先进的文件格式应运而生,就比如谷歌的 WebP 与苹果的 AVIF、HEIC 图片格式。
这些图片格式具有更高的压缩比、更低的图像精度损失,并且大部分先进的浏览器都已经支援这些新的格式。(Edge目前还不支持AVIF,垃圾微软!)
既然如此,那么该如何在 .NET 中处理这些新兴的图片格式呢? Magick.NET 类库或许可以帮你解决这些烦恼!
- 阅读全文 -
随着科技的进步,越来越多新的、更先进的文件格式应运而生,就比如谷歌的 WebP 与苹果的 AVIF、HEIC 图片格式。
这些图片格式具有更高的压缩比、更低的图像精度损失,并且大部分先进的浏览器都已经支援这些新的格式。(Edge目前还不支持AVIF,垃圾微软!)
既然如此,那么该如何在 .NET 中处理这些新兴的图片格式呢? Magick.NET 类库或许可以帮你解决这些烦恼!
- 阅读全文 -
我用的是比较古老的VS版本,今天在添加了几个包之后,发现编译时会引发 bc30652 错误,提示 “必须添加对程序集 netstandard 的引用”。
netstandard 本就应该集成在工程文件的引用之内,可能是因为我用的VS版本比较老,所以默认的工程模板并没有自动引用。
但是我自己添加引用时,发现根本搜不到 netstandard 的类库,自己去 nuget 下一个新版本的 netstandard ,引用后又发现版本对不上,引发了更多的错误……
最后搜索半天,终于发现了解决办法,而且还非常搞笑。
我们只需要手动修改工程文档的 vbproj
或者 csproj
文件,在 ItemGroup
节点添加一个 netstandard
的引用即可:
<ItemGroup>
<Reference Include="netstandard" />
<!-- 其他引用 -->
</ItemGroup>
修改完成后,让VS重新加载工程,编译——成功运行……- 阅读全文 -
.NET 可以在工程属性中设置“程序集版本”与“文件版本”两种版本信息。
其中 程序集版本 不会应用到编译后的程序或是类库的文件右键属性的详细信息当中,仅用于.NET自己的运行环境中。
另一个属性“文件版本”则是会嵌入到文件属性面板中,也可以被系统API调用,只不过默认的.NET工程会将该数据同时应用到“文件版本”与“产品版本”这两个项目当中。
如果你需要分别设置这两个版本号,则可以在 AssemblyInfo.vb
或是 AssemblyInfo.cs
中添加一个参数:
- 阅读全文 -
.NET 桌面程序一般使用传统的 WinForm 或者较新的 WPF 来进行开发。
WinForm的优点是流程简单,即拖即用;但缺点是布局方式较为简陋,维护和更新困难,想要美化界面则需要涉及底层的子类化、或者重写控件绘制。
WPF 曾是微软大力推广的新型UI设计方案,采用XAML(XML)来绑定控件与代码,做到前后端分离,结构上与HTML非常相似。然而微软这种重复造轮子的行为,不仅没能推广WPF,反而因为复杂的学习成本,导致WPF一直处于叫好不叫座的尴尬境地。其实 .NET 早就该拥抱HTML这种通用的界面方案,何必再弄个WPF来脱裤子放屁呢?
其实在 .NET 中应用 Web 界面的方法有不少,最简单的就是使用内部的 WebBrowser
控件,其本身支持通过COM方式与本地代码交互,只不过因为 WebBrowser 使用的是IE内核,无法支持最新的HTML5标准,所以在设计界面时会束手束脚,也无法应用HTML最新的特性。
比较常用的方式是使用第三方的 Chromium 库如 CefSharp,但缺点就是太臃肿了!!!如果你只是写一个小程序,不会想拖个几百兆的 Chromium 运行库进去吧?
另外,微软也推出了 WebView2 组件,用于代替IE内核的 WebBrowser,只不过它需要安装运行库,且内核用的是 Edge 版本的 Chromium 内核,肯定不如原版 Chromium 迅捷。
而除了 CefSharp 和 WebView2 之外的选择,就是我今天要介绍的 Miniblink 了!
- 阅读全文 -
DNS就是我们所熟知的域名系统,当我们访问一个网站的时候,可以直接输入域名地址,之后我们的请求会通过公共的DNS服务器进行解析,由DNS服务器返回域名所在服务器的IP地址,再通过IP与网站服务器进行交互。
DNS除了提供网址IP的A记录功能之外,其实还有许多其他功能,比如CNAME别名记录、MX邮件记录、NS域名服务器、TXT文本记录等。
虽然.NET系统提供了丰富的网络连接功能,却没有一个比较好用的DNS记录获取功能,如果你想获取一个域名的TXT或者MX等数据,就需要调用Windows系统内置的 DnsQuery
API。
只不过 DnsQuery
用起来比较麻烦,并且返回值还需要通过指针从非托管内存中来拷贝出数据,所以我直接在网上找到了现成的C#库源码,然后用工具转化成了VB,再手动修正了一些代码错误。
- 阅读全文 -
虽然目前32位操作系统的用户已经很少了,但若是你的程序需要兼容x86系统,可以参考一下本文。
首先,.NET 的类库是可以同时兼容x86和x64系统的(编译选项中设置目标CPU为AnyCPU),只要你的类库不包含任何本地代码(C、C++等)、或者针对特定系统的代码。
如果你的程序调用了第三方的类库,并且只能提供 x86\x64 两个版本的话,就需要在执行时设置类库文件的位置。
- 阅读全文 -
SQLite 是免费、开源的内嵌式文件数据库,不需要服务器端,也没有客户端的限制,采用的是内嵌方式或者是动态链接,用来访问和改写数据库文件。SQLite 是许多操作系统(如安卓和Linux)的默认数据库,比微软的 ACCESS 高不知道哪里去。
目前最新版的 SQLite 已支持许多流行的查询函数,比如 JSON
和 REGEXP
等。其中 REGEXP 可以对字段进行正则匹配,JSON 则是可以直接读写JSON格式的文本内容。
然而目前 SQLite 的 .NET 版本仅支持 JSON 相关函数,REGEXP 的正则匹配函数并不支持。
好在 SQLite 的扩展性非常高,我们可以自行为 SQLite 添加函数,用于补齐 SQLite.NET 内不支持的函数。
并且,由于我们采用 .NET 的正则处理类,所以我们可以使用更加标准的正则语法,而非 SQLite 较为“畸形”和不便的原生规则。
- 阅读全文 -
dotNET 中拥有“反射”这一机制,可以在运行时动态加载类库、分析类型、创建对象、调用方法属性等。因此,反射非常适合做插件系统或是动态内容更新。
然而反射拥有一个非常致命的缺点:已被加载的程序集,是无法在程序运行期间卸载的!!!
没错,如果你使用了反射功能,那么所有被加载的程序集,会一直占用你的内存,直到你关闭程序。
那么是否有方法可以在程序运行期间动态加载与卸载程序集呢?
答案就是“AppDomain(程序域)”。
- 阅读全文 -
Lua 是一款免费开源的嵌入式脚本语言,使用C语言开发,轻量、敏捷、可扩展性强,因此有许多程序使用Lua作为自己的脚本开发环境,用于程序的热更新、插件系统、或是逻辑代码等等。
Lua采用C语言开发,因此C、C++可以直接将其集成到程序内部,其他语言也可以使用 Lua 的动态运行库,将其动态加载到自己的程序中。
如果想在.NET中使用Lua,目前的方案也有许多,但我个人比较推荐 MoonSharp、NeoLua 和 NLua,其中 MoonSharp 和 NeoLua 是完全用C#写的基于Lua5.2、5.3的.NET库,而 NLua 则是基于Lua官方的DLL运行库所包装的.NET库(支持最新的LUA5.4)。
速度上应该是 NLua 更快,兼容性最高,所以本文将采用 NLua 作为教程。
- 阅读全文 -
我自己喜欢写点小程序,经常会需要保存一些配置与参数。
如果数据量比较多、比较杂乱,我还是推荐使用 Newtonsoft.Json 或者新版本内置的 System.Text.Json 。
Json格式较容易序列化与反序列化,不需要自己关注太多,使用较为轻松。
然而若是程序比较小,存储的数据量不是很多的话,我个人经常使用的是INI配置文件。
INI这种文件十分古老,格式也非常简单,并且 Windows 系统内部就有读写INI的API,如 GetPrivateProfileString
和 WritePrivateProfileString
。
不过 GetPrivateProfileString
和 WritePrivateProfileString
这两个API接口并不支持读取内存中的数据,或者是文件流、网络流,所以在某些时候使用并不方便。
因此,我自己就写了一个自用的INI类库,方便自己更容易读写INI配置文件,同时也方便自己控制何时读取、从哪里读取、何时写入数据。
- 阅读全文 -