有时,我们需要为类或组件等添加许可。
而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 成员
}
}
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 成员
}
}