示例:演示如何使用系统自带System.ComponentModel.LicenseProvider 许可模块

一、目的:在开发过程中,定义许可验证的方式有很多,下面演示系统自带的许可验证的使用方法

        LicenseProvider 是 .NET 框架中的一个类,用于实现组件和控件的许可机制。它允许开发者为自定义控件或组件添加许可验证,以确保只有授权用户才能使用这些控件或组件。

如何使用 LicenseProvider
1.    创建自定义的 LicenseProvider:你需要继承 LicenseProvider 类并实现其 GetLicense 方法。
2.    应用 LicenseProvider:在你的自定义控件或组件上应用 LicenseProvider 特性。
3.    验证许可:在控件或组件的构造函数中验证许可。

        LicFileLicenseProvider 是 .NET 框架中的一个内置类,用于从许可文件中读取和验证许可信息。它简化了许可验证的过程,使你不必手动实现从文件读取和验证许可的逻辑。



二、实现


首先,定义一个自定义控件MyButton

添加LicenseProvider特性,类型设置为自带LicFileLicenseProvider,

使用LicenseManager.Validate进行验证

    [LicenseProvider(typeof(LicFileLicenseProvider))]public class MyButton : Button{public MyButton(){using (License license = LicenseManager.Validate(typeof(MyButton), this)){System.Diagnostics.Debug.WriteLine("许可验证成功");}}}

在窗口添加程序 

    <Grid><local:MyButton Content="License"/></Grid>

此时运行程序,当创建MyButton时验证许可提示错误,如下:

然后,添加许可文件到根目录

内容如下: 

再运行程序,此时运行通过

自定义扩展LicFileLicenseProvider

    /// <summary>/// 自定义LicFileLicenseProvider/// </summary>public class MyLicFileLicenseProvider : LicFileLicenseProvider{/// <summary>/// 检查密钥是否有效    /// </summary>protected override bool IsKeyValid(string key, Type type){return base.IsKeyValid(key, type);}protected override string GetKey(Type type){return base.GetKey(type);}/// <summary>/// 获取组件实例的许可证并确定其是否有效/// </summary>/// <returns></returns>public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions){return base.GetLicense(context, type, instance, allowExceptions);}}

 通过自定义扩展LicFileLicenseProvider或LicenseProvider可以自定义许可文件密钥规则(Mac地址,网卡,许可截止日期等),和文件路径规则(保存在文档目录或服务器目录等其他目录,默认在程序集根目录)

 注意事项
•    许可验证逻辑:在 IsValidLicense 方法中实现你的许可验证逻辑。你可以从文件、数据库或其他存储中读取许可信息,并进行验证。
•    异常处理:在 GetLicense 方法中,如果许可验证失败且 allowExceptions 为 true,应抛出 LicenseException 异常。
•    资源管理:确保在控件或组件的 Dispose 方法中正确释放许可资源。
通过上述步骤,你可以为自定义控件或组件添加许可验证机制,确保只有授权用户才能使用它们。

总结

1.在需要许可的类型上增加特性

[LicenseProvider(typeof(LicFileLicenseProvider))]

2.在应用程序根目录添加许可文件

H.Test.Demo5.MyButton.lic 内容以“H.Test.Demo5.MyButton is a licensed component.”开头

3.在需要验证许可的地方调用

            using (License license = LicenseManager.Validate(typeof(MyButton), this))
            {
                System.Diagnostics.Debug.WriteLine("许可验证成功");
            }

需要了解的知识点

 LicenseProvider Class (System.ComponentModel) | Microsoft Learn

LicenseProviderAttribute Class (System.ComponentModel) | Microsoft Learn

LicFileLicenseProvider Class (System.ComponentModel) | Microsoft Learn

License Class (System.ComponentModel) | Microsoft Learn

LicenseManager Class (System.ComponentModel) | Microsoft Learn

LicenseContext Class (System.ComponentModel) | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1488778.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

当 Nginx 出现请求的乱序到达,如何处理?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 当 Nginx 出现请求的乱序到达&#xff0c;如何处理&#xff1f;一、理解请求乱序到达的现象二、请求乱序到达可能带来的影响三、解决方案&#xff08;一&#xf…

生物信息学新突破:在英特尔 Gaudi 2 上实现 ProtST 蛋白质语言模型加速

引言 随着人工智能技术的快速发展&#xff0c;蛋白质结构预测和语言模型在生物信息学领域扮演着越来越重要的角色。ProtST作为一种新兴的蛋白质语言模型&#xff0c;其性能在英特尔 Gaudi 2 加速器的助力下得到了显著提升。本文将探讨如何利用英特尔 Gaudi 2 加速 ProtST 模型…

JAVA简介与开发环境配置(基础介绍 一)

目录 Java 简介 主要特性 发展历史 Java开发工具 Java 开发环境配置 window系统安装java 下载JDK 配置环境变量 通过控制台测试JDK是否安装成功 Linux&#xff0c;UNIX&#xff0c;Solaris&#xff0c;FreeBSD环境变量设置 流行JAVA开发工具 使用 Eclipse 运行第一…

vue3前端开发-小兔鲜项目-登录组件的开发表单验证

vue3前端开发-小兔鲜项目-登录组件的开发表单验证&#xff01;现在开始写登录页面的内容。首先这一次完成基础的首页按钮点击跳转&#xff0c;以及初始化一些简单的表单的输入验证。后期还会继续完善内容。 1&#xff1a;首先还是准备好login页面的组件代码内容。 <script …

【Hot100】LeetCode—152. 乘积最大子数组

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;152. 乘积最大子数组 1- 思路 动规五部曲 2- 实现 ⭐152. 乘积最大子数组——题解思路 class Solution {public int maxProduct(int[] nums) {// 初始化答案以及以第一个元…

学习记录:ESP32控制舵机 FREERTOS BLE

控制舵机 PWM信号 PWM信号是一种周期性变化的方波信号&#xff0c;它有两个关键参数&#xff1a; 周期&#xff08;Period&#xff09;&#xff1a;一个完整的PWM信号的时间长度&#xff0c;通常用秒&#xff08;s&#xff09;或毫秒&#xff08;ms&#xff09;表示。占空比…

400万次服务,萝卜快跑席卷11城,时间进入全民AI时代?

ChatGPT、Midjourney、Sora、数字人…… 当我们还以为AI智能在现阶段只是对互联网造成影响时&#xff0c;出租车行业被无人驾驶汽车炸了锅。 近日&#xff0c;自动驾驶网约车“萝卜快跑”宣布其在短短几个月内&#xff0c;已经完成了超过400万次无人驾驶服务。且已在11个城市开…

谷粒商城实战笔记-63-商品服务-API-品牌管理-OSS获取服务端签名

文章目录 一&#xff0c;创建第三方服务模块thrid-party1&#xff0c;创建一个名为gulimall-third-party的模块2&#xff0c;nacos上创建third-party命名空间&#xff0c;用来管理这个服务的所有配置3&#xff0c;配置pom文件4&#xff0c;配置文件5&#xff0c;单元测试6&…

Ruoyi-WMS本地运行

所需软件 1、JDK&#xff1a;8 安装包&#xff1a;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.htmlopen in new window 安装文档&#xff1a;https://cloud.tencent.com/developer/article/1698454open in new window 2、Redis 3.0 安装包&a…

大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Ubuntu设置网络

进入网络配置文件夹 cd /etc/netplan 使用 vim 打开下的配置文件 打开后的配置 配置说明&#xff1a; network:# 网络配置部分ethernets:# 配置名为ens33的以太网接口ens33:addresses:# 为ens33接口分配IP地址192.168.220.30&#xff0c;子网掩码为24位- 192.168.220.30/24n…

GraphRAG深入解析

GraphRAG深入解析 GraphRAG 深入解析概述索引查询 索引过程深入解析步骤 1&#xff1a;处理文本块步骤 2&#xff1a;图提取步骤 3&#xff1a;图增强步骤 4&#xff1a;社区总结步骤 5&#xff1a;文件处理步骤 6&#xff1a;网络可视化 查询过程深入解析本地搜索问题生成全局…

【MySQL进阶篇】锁:全局锁、表级锁以及行级锁

一、锁的概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须要解决的一个问题&am…

基于Python的河南省天气数据分析与空气质量预测研究【含数据抓取与数据库自动存储】

有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 抓取天气网站 以下是部分代码展示 import matplotlib.pyplot as plt# 设置中文字体 plt.rcParams[axes.unicode_minus] False # 不使用中文减号 plt.rcParams[font.sans-serif] FangSong # …

Python爬虫技术 第14节 HTML结构解析

HTML 结构解析是 Web 爬虫中的核心技能之一&#xff0c;它允许你从网页中提取所需的信息。Python 提供了几种流行的库来帮助进行 HTML 解析&#xff0c;其中最常用的是 BeautifulSoup 和 lxml。 1. 安装必要的库 首先&#xff0c;你需要安装 requests&#xff08;用于发送 HTT…

Linux系统上安装zookeeper

百度网盘 通过网盘分享的文件&#xff1a;zookeeper_linux 链接: https://pan.baidu.com/s/1_hybXZVwTRkotz0VbwbSMw?pwd8888 提取码: 8888 1.将压缩包拖进虚拟机 2.解压压缩包 cd /ruanjian/zookeeper/ tar -zxvf apache-ZooKeeper-3.7.2-bin.tar.gz3. 进入到conf目录 cd …

Godot入门 03世界构建1.0版

在game场景&#xff0c;删除StaticBody2D节点&#xff0c;添加TileMap节点 添加TileSet图块集 添加TileSet源 拖动图片到图块&#xff0c;自动创建图块 使用橡皮擦擦除。取消橡皮擦后按住Shift创建大型图块。 进入选择模式&#xff0c;TileMap选择绘制&#xff0c;选中图块后在…

通过强大的语义层增强现代数据湖

在现代数据湖架构中&#xff0c;语义层通过向数据添加有意义的上下文来发挥至关重要的作用&#xff0c;否则这些上下文会丢失。此层充当现代数据湖&#xff08;数据仓库和查询引擎&#xff09;处理层中未整理的原始数据与利用此数据的工具和应用程序之间的桥梁。此服务对 AI 特…

【Golang 面试基础题】每日 5 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

【中项】系统集成项目管理工程师-第5章 软件工程-5.6软件质量管理与5.7软件过程能力成熟度

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…