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

    }

  • 相关阅读:
    快捷定位目录 z武器
    [UOJ317]【NOI2017】游戏 题解
    2-SAT 问题与解法小结
    link-cut-tree 简单介绍
    hihocoder #1456 : Rikka with Lattice(杜教筛)
    杜教筛小结
    BZOJ 2969: 矩形粉刷(期望)
    UVA10294 Arif in Dhaka (群论,Polya定理)
    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
    BZOJ 2683: 简单题(CDQ分治 + 树状数组)
  • 原文地址:https://www.cnblogs.com/McJeremy/p/1432913.html
Copyright © 2011-2022 走看看