zoukankan      html  css  js  c++  java
  • C# 应用程序许可控制

    源代码下载:LicenseDemo.rar

    首先,需要实现一个LicenseProvider
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Management;
    using System.Security.Cryptography;
    using System.Security.Permissions;

    namespace LicenseDemo
    {
        [ReflectionPermission(SecurityAction.Deny, MemberAccess
    =false, ReflectionEmit=false)]
        
    internal class MyLicenseProvider : LicenseProvider
        
    {
            
    Define MyLicense

            
    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("Zx2@Yt8P");
                
    //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;
            }

        }

    }

    然后,在需要许可控制的组件上使用该LicenseProvider:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace LicenseDemo
    {
        [LicenseProvider(
    typeof(MyLicenseProvider))]
        
    public partial class Form1 : Form
        
    {
            
    private License mLicense = null;
            
            
    public Form1()
            
    {
                
    this.mLicense = LicenseManager.Validate(typeof(Form1), this);
                InitializeComponent();
            }


            
    ~Form1()
            
    {
                
    if (this.mLicense != null)
                
    {
                    
    this.mLicense.Dispose();
                    
    this.mLicense = null;
                }

            }


            
    private void button1_Click(object sender, EventArgs e)
            
    {
                System.Windows.Forms.MessageBox.Show(
    "Hello, world!");
            }

        }

    }

    直接运行,在Form1窗口出来之前,先会Show出一个“!!!尚未注册!!!”的对话框,这是因为还没有提供License文件的缘故。然后在程序exe文件目录创建一个license.dat文件,使用notepad编辑,直接将本机Mac地址复制进来,然后保存该文件,此时相当于用户已经提供了正确的许可文件,再运行,就不会提示尚未注册的对话框了。
  • 相关阅读:
    实验十三 团队作业9:Beta冲刺与团队项目验收
    《你们都是魔鬼吗》团队作业Beta冲刺---第一天
    #《你们都是魔鬼吗》第八次团队作业:第五天Alpha冲刺
    《你们都是魔鬼吗》第八次团队作业:第三天Alpha冲刺
    《你们都是魔鬼吗》第八次团队作业:第四天Alpha冲刺
    《你们都是魔鬼吗》第八次团队作业 第二天Alpha
    《你们都是魔鬼吗》第八次团队作业:第一天Alpha冲刺
    《你们都是魔鬼吗》实验十二 团队作业八:Alpha冲刺
    Redis主从复制实现原理
    Redis数据类型之SDS简单动态字符串
  • 原文地址:https://www.cnblogs.com/hcfalan/p/501680.html
Copyright © 2011-2022 走看看