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>
查看全文
相关阅读:
有点自作聪明
curl 一个无比有用的网站开发工具
[Swift]LeetCode889. 根据前序和后序遍历构造二叉树 | Construct Binary Tree from Preorder and Postorder Traversal
[Swift]LeetCode888. 公平的糖果交换 | Fair Candy Swap
[Swift]LeetCode887. 鸡蛋掉落 | Super Egg Drop
[Swift]LeetCode886. 可能的二分法 | Possible Bipartition
[Swift]LeetCode885. 螺旋矩阵 III | Spiral Matrix III
[Swift]LeetCode884. 两句话中的不常见单词 | Uncommon Words from Two Sentences
[Swift]LeetCode883. 三维形体投影面积 | Projection Area of 3D Shapes
[Swift]LeetCode882. 细分图中的可到达结点 | Reachable Nodes In Subdivided Graph
原文地址:https://www.cnblogs.com/McJeremy/p/1432913.html
最新文章
/etc/sysctl.conf
电影艺术
Ext.js项目(二)
Ext.js项目(一)
应用抽象工厂+反射实现通用数据源的设计(三)
SqlServer基础语句练习(一)
Array,ArrayList,泛型List比较
应用抽象工厂+反射实现通用数据源的设计(二)
应用抽象工厂+反射实现通用数据源的设计(一)
JavaScript中函数的继承
热门文章
Ext.js入门
MVC中页面的传值方式总结
javaScript高级教程(四) 复制对象
javaScript高级教程(三) javaScript不支持关联数组,只是语法上像关联数组
javaScript高级教程(二)Scope Chain & Closure Example
javaScript 载入自执行
html中载入自执行getElementById("xx")得到null
javaScript高级教程(一)javaScript 1.6 Array 新增函数
nodejs(二)child_process模块
nodejs(一)process模块
Copyright © 2011-2022 走看看