.NET中的许可证机制--License
.NET中的许可证机制
主要类:
System.ComponentModel.License(为所有许可证提供 abstract 基类。向组件的特定实例授予许可证)
System.ComponentModel.LicenseContext(指定何时可使用授权的对象,并且提供一种方法,用以获取为支持在其域内运行的许可证所需要的附加服务)
System.ComponentModel.LicenseException(表示当组件不能被授予许可证时引发的异常。)
System.ComponentModel.LicenseManager(提供属性和方法,用以将许可证添加到组件和管理 LicenseProvider)
System.ComponentModel.LicenseProvider(提供 abstract 基类以便实现许可证提供程序)
System.ComponentModel.LicenseProviderAttribute(指定要与类一起使用的 LicenseProvider)
许可证机制简介
.Net Framework中的许可证验证机制基于System.ComponentModel命名空间中的License、LicenseContext、LicenseException、LicenseManager、LicenseProvider和LicenseProviderAttribute六个类实现的。
License是一个抽象类,用于代表许可证主体;
LicenseContext中保存了许可证的上下文,其中UsageMode属性可以用来获取当前是运行时(runtime)还是设计模式(designtime);
LicenseException是许可证相关的异常,当许可证信息不可用时,在调用LicenseProvider(或其派生类)实例的GetLicense方法时将抛出此类型的异常;
LicenseManager是一个密封(sealed)类,LicenseManager提供了多个静态(static)方法用于验证许可证、获取许可证等操作;
LicenseProviderAttribute属性用于指定某一个类所采用的许可证提供程序(LicenseProvider)的具体类型;
LicenseProvider是一个抽象类,用于代表许可证验证机制提供程序。LicenseProvider的类型通过LicenseProviderAttribute属性提供给CLR,当调用LicenseManager的操作时,LicenseManager将根据LicenseProviderAttribute中所提供的LicenseProvider类型创建LicenseProvider实例,并进行相应操作。LicFileLicenseProvider基于文本文件的许可证机制。
简单应用:
1:首先要创建一个License,但是因为License是抽象的,所以要创建一个集成自License的子类,实现License的一些方法。
2:创建一个LicenseProvider类,这个类要集成LicenseProvider的类。实现一些方法。LicenseProvider类提供了验证机制的程序。LicenseProvider类要重载GetLicense(LicenseContext,Type ,object ,bool)方法,该方法真正提供了,一些算法,去实现验证。
3:创建一个自定义的类,并且给该类添加LicenseProviderAttribute属性。指定对这个类进行验证的机制采用LiceseProvider。
具体代码:
定义Licese类
private class MyLicense : License
{
private String mLicenseKey = null;
private MyLicenseProvider mProvider = null;
public MyLicense(MyLicenseProvider provider, String key)
{
this.mProvider = provider;
this.mLicenseKey = key;
}
public override string LicenseKey
{
get { return this.mLicenseKey; }
}
public override void Dispose()
{
this.mProvider = null;
this.mLicenseKey = null;
}
}
定义LicenseProvider类
[ReflectionPermission(SecurityAction.Deny, MemberAccess=false, ReflectionEmit=false)]
internal class MyLicenseProvider : LicenseProvider
{
构造函数
public MyLicenseProvider()
{ }
/// <summary>
/// 获取本机MAC地址 其实这个不管是获取本机硬件参数的任何信息都可以这要能标志该机器即可
/// </summary>
private String GetMacAddress()
{
String macAddr = null;
ManagementClass inetAdapter = new ManagementClass("WIN32_NetworkAdapterConfiguration");
ManagementObjectCollection objList = inetAdapter.GetInstances();
foreach (ManagementObject mobj in objList)
{
if ((bool)mobj["IPEnabled"])
{
macAddr = mobj["MacAddress"].ToString().Replace(":", "-");
break;
}
}
return macAddr;
}
/// <summary>
/// 获取Assembly所在目录 获取应用程序所在的目录
/// </summary>
private String GetAssemblyPath(LicenseContext context)
{
String fileName = null;
Type type = this.GetType();
ITypeResolutionService service = (ITypeResolutionService)context.GetService(typeof(ITypeResolutionService));
if (service != null)
{
fileName = service.GetPathOfAssembly(type.Assembly.GetName());
}
if (fileName == null)
{
fileName = type.Module.FullyQualifiedName;
}
return Path.GetDirectoryName(fileName);
}
private String Encrypt(String source) 加密算法,可以用,也可不用,这里为了更安全,就用。
{
/**
* 加密算法
*/
byte[] keyData = Encoding.ASCII.GetBytes("");
byte[] ivData = Encoding.ASCII.GetBytes("4iJ9Qw#L");
MemoryStream stream = new MemoryStream();
DES desProvider = new DESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(stream,
desProvider.CreateEncryptor(keyData, ivData),
CryptoStreamMode.Write);
byte[] buffer = Encoding.ASCII.GetBytes(source);
cs.Write(buffer, 0, buffer.Length);
cs.FlushFinalBlock();
cs.Close();
buffer = stream.GetBuffer();
stream.Close();
return Convert.ToBase64String(buffer);
return source;
}
public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions)
{
MyLicense license = null;
// 计算MAC地址加密串
String macAddr = this.GetMacAddress();
String encrypt = this.Encrypt(macAddr);
if (context != null)
{
if (context.UsageMode == LicenseUsageMode.Runtime)
{
String savedLicenseKey = context.GetSavedLicenseKey(type, null);
if (encrypt.Equals(savedLicenseKey))
{
return new MyLicense(this, encrypt);
}
}
if (license != null)
{
return license;
}
// 打开License文件 'license.dat'
String path = this.GetAssemblyPath(context);
String licFile = Path.Combine(path, "license.dat");
if (File.Exists(licFile))
{
Stream fs = new FileStream(licFile, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
String readedLicenseKey = sr.ReadToEnd();
sr.Close();
fs.Close();
if (encrypt.Equals(readedLicenseKey))
{
license = new MyLicense(this, encrypt);
}
}
if (license != null)
{
context.SetSavedLicenseKey(type, encrypt);
}
}
if (license == null)
{
System.Windows.Forms.MessageBox.Show("!!!尚未注册!!!");
return new MyLicense(this, "evaluate");
}
return license;
}
指定该类进行许可验证的程序采用MyLicenseProvider 这句必须的。
[LicenseProvider(typeof(MyLicenseProvider))]
public partial class LicenseHelper
{
private License mLicense = null;
public LicenseHelper()
{
this.mLicense = LicenseManager.Validate(typeof( LicenseHelper), this);
}
~ LicenseHelper() 析构函数,在C#中,不常用。
{
if (this.mLicense != null)
{
this.mLicense.Dispose();
this.mLicense = null;
}
}
}
这样。在程序中调用LicenseHelper是就要进行验证,否则。就会出现异常。
该方法也可以对软件进行加密,只是在GetLicense(LicenseContext, type, object,bool);方法中写的机密算法要复杂一些。但是道理都是这样的。
出处:http://blog.csdn.net/joyhen/article/details/22715223
.NET中的许可证机制--License的更多相关文章
- 1 weekend110的复习 + hadoop中的序列化机制 + 流量求和mr程序开发
以上是,weekend110的yarn的job提交流程源码分析的复习总结 下面呢,来讲weekend110的hadoop中的序列化机制 1363157985066 13726230503 ...
- 探索Android中的Parcel机制(上)
一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...
- Android中的Parcel机制(上)
一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态, ...
- .Net中Remoting通信机制简单实例
.Net中Remoting通信机制 前言: 本程序例子实现一个简单的Remoting通信案例 本程序采用语言:c# 编译工具:vs2013工程文件 编译环境:.net 4.0 程序模块: Test测试 ...
- Objective-C中的属性机制
Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现.在学习OC中属性之前我们先要知道为什么要为变量实现gett ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- C++中的异常处理机制
C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作 ...
- 别再为了this发愁了------JS中的this机制
别再为了this发愁了------JS中的this机制 题记:JavaScript中有很多令人困惑的地方,或者叫做机制.但是,就是这些东西让JavaScript显得那么美好而与众不同.比方说函数也是对 ...
随机推荐
- day12 Python数字,字符串,列表,元祖,字典总结
一.数字 int() 二.字符串 replace/find/join/strip/startswith/split/upper/lower/format tempalte = "i am { ...
- IDEA里面添加lombok插件,编写简略风格Java代码(转)
文章转自http://blog.csdn.net/hinstenyhisoka/article/details/50468271 在 java平台上,lombok 提供了简单的注解的形式来帮助我们消除 ...
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...
- Python虚拟环境和包管理工具Pipenv的使用详解--看完这一篇就够了
前言 Python虚拟环境是一个虚拟化,从电脑独立开辟出来的环境.在这个虚拟环境中,我们可以pip安装各个项目不同的依赖包,从全局中隔离出来,利于管理. 传统的Python虚拟环境有virtualen ...
- 1-Android开发验证码(使用第三方Mob,注册)
http://www.mob.com/ 注册以后 可以直接放在 可以下载到手机里面试一下了 后续就不截图了 补充: 自定义签名
- Python写代码的时候为什么要注释?Sun因此被Oracle收购
导读: 此块分为:1.注释的重要性 2.如何正确注释 注释的重要性 在我们看代码的时候,会遇到很多看不懂得代码,特别是在做项目的时候,代码的注释以及命名习惯的重要性就有了为什么这么说呢? 因为在很多情 ...
- linux编程头文件所在路径的问题
一.问题引入 1.头文件与库 当我们在PC主机linux环境下(如ubuntu),编写linux应用程序,然后利用gcc来编译.在源代码的开始位置会写入头文件,那是因为我们使用了系统提供的库函数,例如 ...
- Luogu4622 COCI2012-2013#6 JEDAN 组合、DP
传送门 题意:给出一个$N$个数的序列$a_i$,其中$a_i=-1$表示第$i$个位置数字未知,问有多少种用非负整数代替$a_i$中$-1$的方法使得从全$0$序列经过以下操作若干次得到序列$a_i ...
- CF58E Expression 搜索
题目传送门:http://codeforces.com/problemset/problem/58/E 题意:给出一个形如$x+y=z$(不一定正确)的式子,试输出一个$a+b=c$的式子,满足:$1 ...
- 转:判断js中的数据类型的几种方法
判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...