zoukankan
html css js c++ java
NET许可证及License
有时,我们需要为类或组件等添加许可。
而NET FCL为 我们提供了一些相关类的使用。
这些类都在System.ComponentModel命名空间下。
下面是简单的一个实现:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
Microsoft.Win32;
using
System.Runtime.InteropServices;
using
System.ComponentModel;
/**/
/*
* Test by McJeremy&Xu
* url:
http://www.cnblogs.com/mcjeremy
*
*/
namespace
MyLicenseTest
{
/**/
/*
* License许可由License(许可证)、LicenseProvider(许可证提供器)、LicenseManager管理三部分组成
* 使用过程一般如下:
* 1、创建继承自License并实现其抽象属性LicenseKey的License类
* 2、创建继承自LicenseProvider并实现其抽象方法GetLicense的Provider类
* 3、在需要验证许可的类或组件(等)的构造方法中使用LicenseMangager的静态Validate或IsValid方法,其中
* Validate产生异常,而IsValid不产生
*/
class
Program
{
static
void
Main(
string
[] args)
{
try
{
MyLicenseTestClass mltc
=
new
MyLicenseTestClass();
Console.WriteLine(
"
MyLicenseTestClass被许可使用了!
"
);
}
catch
(LicenseException e)
{
Console.WriteLine(e.Message);
}
Console.ReadLine();
}
}
//
Step1:实现License类
public
class
SimpleRuntimeLicense : License
{
private
string
TypeCode;
public
override
string
LicenseKey
{
get
{
return
TypeCode; }
}
public
override
void
Dispose()
{
}
public
SimpleRuntimeLicense(Type type)
{
this
.TypeCode
=
type.GUID.ToString();
}
}
//
Step2:实现licenseProvider类,使用Provider设计模式
//
NET提供了LicFileLicenseProvider类,一般情况下,我们需要提供我们自己的Provider来实现Validate逻辑
public
class
SimpleRuntimeLicenseProvider : LicenseProvider
{
/**/
///
<summary>
///
///
</summary>
///
<param name="context">
验证上下文
</param>
///
<param name="type">
被验证对象类型
</param>
///
<param name="instance">
被验证对象实例
</param>
///
<param name="allowExceptions">
是否在验证没通过时抛出异常
</param>
///
<returns>
验证通过后的许可证
</returns>
public
override
License GetLicense(LicenseContext context, Type type,
object
instance,
bool
allowExceptions)
{
//
通过licenseUsageMode可以指定验证范围是在设计时还是运行时
if
(context.UsageMode
==
LicenseUsageMode.Runtime
||
context.UsageMode
==
LicenseUsageMode.Runtime)
{
RegistryKey rk
=
Registry.LocalMachine.OpenSubKey(
@"
SOFTWARE\NETLicenseTest
"
);
if
(
null
!=
rk)
{
try
{
string
lick
=
rk.GetValue(
"
SN
"
).ToString();
if
(
!
string
.IsNullOrEmpty(lick))
{
if
(
string
.Compare(lick, type.GUID.ToString(),
true
)
==
0
)
{
return
new
SimpleRuntimeLicense(type);
}
}
}
catch
{
//
设定没有许可证时的提供信息
throw
new
LicenseException(type, instance,
"
您没有许可证!无法运行!
"
);
}
}
}
return
null
;
}
}
//
Step3:在需要许可验证的类型中使用LicenseProvider和LicenseManager
[Guid(
"
7F46DB6D-98CD-4cb7-BA95-014F678B2375
"
)]
[LicenseProvider(
typeof
(SimpleRuntimeLicenseProvider))]
public
class
MyLicenseTestClass:IDisposable
{
License lic
=
null
;
public
MyLicenseTestClass()
{
lic
=
LicenseManager.Validate(
this
.GetType(),
this
);
//
LicenseManager.IsValid(
}
IDisposable 成员
#region
IDisposable 成员
private
bool
disposed
=
false
;
void
IDisposable.Dispose()
{
Dispose(
true
);
GC.SuppressFinalize(
this
);
}
public
void
Dispose(
bool
disposing)
{
if
(
!
disposed)
{
if
(disposing)
{
if
(
null
!=
lic)
{
lic.Dispose();
}
}
}
}
~
MyLicenseTestClass()
{
Dispose(
false
);
}
#endregion
}
}
<h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>
查看全文
相关阅读:
【数据库】mysql 服务不能安装 与闪退
【vue】遍历循环添加a标签的属性值 与获取某个属性值
写在大一
一些关于新材料研究的想法
我的大学求学之路
河南洛阳中铝洛铜实习
html-制作导航菜单
全局CSS的配置
手扭到了
第一次用,大家照顾哈
原文地址:https://www.cnblogs.com/McJeremy/p/1432913.html
最新文章
Ansible安装配置及命令使用详解
php5.6安装及php-fpm优化配置
linux防火墙学习
JDK安装
JDK替换掉系统自带的gij编译工具
八.django日志配置
七.数据分页原理,paginator与page对象
六.url配置
五.数据库同步,创建django用户,用户登陆过程
四. django template模版
热门文章
收藏python开发各种资源官方文档
三.接收并处理请求参数与QueryDict对象
【vue】屏蔽敏感词,不使用算法的简单方法
【django】 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
【Django】接收照片,储存文件 前端代码
【JQ的使用】 ajax 与 遍历对象数组
【爬虫】 爬虫请求json数据,返回乱码问题的解决
【python爬虫】windoes的爬虫中文乱码现象,通用转码解决
【django】多对多表添加
【下载很卡】安装包
Copyright © 2011-2022 走看看