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 成员
    }

}

原文地址:https://www.cnblogs.com/McJeremy/p/1432913.html