上篇已经学习了界面的各种功能以及各种配置,本次带大家学习下代码控制许可证。
代码控制许可证的意思就是软件经过.net reactor保护后,到期时客户端就需要购买许可证,这时软件开发商就需要生成许可证等操作,这个操作可以由代码控制来达到自动化的效果。当然不仅仅是生成操作,还包扩获取许可证的信息,作废许可证,激活许可证等操作。
在安装目录下...\.NET Reactor\SDK\Binaries文件夹下可以找到License.dll和LicenseGen.dll(.net编写 .net reactor是一个.net 编写的程序)。其中License.dll主要用于获取许可证信息,作废许可证,激活许可证等,可整合到软件项目中,而LicenseGen.dll主要用于生成许可证,不可整合,可以用于许可证自动生成的服务。
首先看下许可证生成代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
/// <summary>
/// 创建许可证
/// </summary>
/// <param name="project_filename">
private
void
CreateLicenseFile()
{
LicenseGenerator licensegen =
new
LicenseGenerator();
licensegen.AddAdditonalLicenseInformation(
"Company"
,
"Eye"
);
licensegen.Hardware_Enabled =
true
;
licensegen.HardwareID =
"1234-1234-1234-1234-1234"
;
licensegen.CreateLicenseFile(@
"C:\newlicense.license"
);
}
|
这将会在c盘下生成newlicense.license许可证文件,文件的内容包括添加进去的键值对Company-Eye,开启硬件锁,此许可证只针对硬件编码为1234-1234-1234-1234-1234的机器有效。
再来看看License.dll的功能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/// <summary>
/// 许可证是否可用
/// </summary>
/// <returns></returns>
private
bool IsValidLicenseAvailable()
{
return
License.Status.Licensed;
}
/// <summary>
/// 获取许可证键值信息
/// </summary>
private
string ReadAdditonalLicenseInformation()
{
string rtnStr = string.Empty;
if
(License.Status.Licensed)
{
for
(
int
i =
0
; i < License.Status.KeyValueList.Count; i++)
{
string key = License.Status.KeyValueList.GetKey(i).ToString();
string value = License.Status.KeyValueList.GetByIndex(i).ToString();
rtnStr += key +
"-"
+ value + Environment.NewLine;
}
}
return
rtnStr;
}
/// <summary>
/// 获取软件锁定信息
/// </summary>
/// <returns></returns>
private
string ReadLockMsg()
{
string rtnStr = string.Empty;
//使用持续时间锁
bool lock_enabled = License.Status.Evaluation_Lock_Enabled;
License.EvaluationType ev_type = License.Status.Evaluation_Type;
int
time = License.Status.Evaluation_Time;
int
time_current = License.Status.Evaluation_Time_Current;
rtnStr += string.Format(
"是否开启持续时间锁:{0},规定使用最大持续时间{1},现在使用时间{2}\n"
,lock_enabled.ToString(),time.ToString(),time_current.ToString());
//到期锁
bool lock_enabled1 = License.Status.Expiration_Date_Lock_Enable;
System.DateTime expiration_date = License.Status.Expiration_Date;
rtnStr += string.Format(
"是否开启到期锁:{0},到期时间{1}\n"
, lock_enabled1.ToString(), expiration_date.ToShortTimeString());
//使用次数锁
bool lock_enabled2 = License.Status.Number_Of_Uses_Lock_Enable;
int
max_uses = License.Status.Number_Of_Uses;
int
current_uses = License.Status.Number_Of_Uses_Current;
rtnStr += string.Format(
"是否开启使用次数锁:{0},最大使用次数{1},当前使用次数{2}\n"
, lock_enabled2.ToString(), max_uses.ToString(), current_uses.ToString());
//并发运行锁
bool lock_enabled3 = License.Status.Number_Of_Instances_Lock_Enable;
int
max_instances = License.Status.Number_Of_Instances;
rtnStr += string.Format(
"是否限制并行数量:{0},最大并行数量:{1}\n"
, lock_enabled3, max_instances.ToString());
//硬件锁
bool lock_enabled4 = License.Status.Hardware_Lock_Enabled;
string lic_hardware_id =
""
;
if
(lock_enabled)
{
lic_hardware_id = License.Status.License_HardwareID;
}
rtnStr += string.Format(
"证书是否开启硬件锁{0},对于特定硬件的有效{1}\n"
, lock_enabled4.ToString(), lic_hardware_id);
return
rtnStr;
}
/// <summary>
/// 获取机器硬件编号
/// </summary>
/// <returns></returns>
private
string GetHardwareID()
{
return
License.Status.HardwareID;
}
/// <summary>
/// 获取许可证适用的硬件编码
/// </summary>
/// <returns></returns>
private
string GetLicenseHardwareID()
{
return
License.Status.License_HardwareID;
}
/// <summary>
/// 作废许可证
/// </summary>
private
string InvalidateLicense()
{
string confirmation_code = License.Status.InvalidateLicense();
return
confirmation_code;
}
/// <summary>
/// 检查作废许可证的验证码是否有效
/// </summary>
/// <param name="confirmation_code">
/// <returns></returns>
public
bool CheckConfirmationCode(string confirmation_code)
{
return
License.Status.CheckConfirmationCode(License.Status.HardwareID,
confirmation_code);
}
/// <summary>
/// 重新激活许可证
/// </summary>
/// <param name="reactivation_code">
/// <returns></returns>
public
bool ReactivateLicense(string reactivation_code)
{
return
License.Status.ReactivateLicense(reactivation_code);
}
|
其中作废许可证及激活许可证的主要应用场景是:如果许可证开启硬件锁,客户端想从一个机器移动许可证到另一个机器此时就需要先作废许可证,然后在新机器里重新激活许可证。作废许可证可直接调用即可,但是激活许可证需要打开Tools->LicenseReactivation Tool来根据硬件编码生成激活码,传入即可激活许可证。(这里生成激活码我只找到在工具里可视化操作,在代码中找不到这种方法,所以这个应用场景不太适合许可证全自动化的管理)。