.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能
原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能
接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证。
代码控制许可证的意思就是软件经过.net reactor保护后,到期时客户端就需要购买许可证,这时软件开发商就需要生成许可证等操作,这个操作可以由代码控制来达到自动化的效果。当然不仅仅是生成操作,还包扩获取许可证的信息,作废许可证,激活许可证等操作。
在安装目录下...\.NET Reactor\SDK\Binaries文件夹下可以找到License.dll和LicenseGen.dll(.net编写 .net reactor是一个.net 编写的程序)。其中License.dll主要用于获取许可证信息,作废许可证,激活许可证等,可整合到软件项目中,而LicenseGen.dll主要用于生成许可证,不可整合,可以用于许可证自动生成的服务。
首先看下许可证生成代码:
        /// <summary>
        /// 创建许可证
        /// </summary>
        /// <param name="project_filename"></param>
        private void CreateLicenseFile()
        {
            LicenseGenerator licensegen = new LicenseGenerator();
            licensegen.AddAdditonalLicenseInformation("Company", "Eye");
            licensegen.Hardware_Enabled = true;
            licensegen.HardwareID = "1234-1234-1234-1234-1234";
            licensegen.CreateLicenseFile(@"C:\newlicense.license");
        }这将会在c盘下生成newlicense.license许可证文件,文件的内容包括添加进去的键值对Company-Eye,开启硬件锁,此许可证只针对硬件编码为1234-1234-1234-1234-1234的机器有效。
再来看看License.dll的功能:
        /// <summary>
        /// 许可证是否可用
        /// </summary>
        /// <returns></returns>
        private bool IsValidLicenseAvailable()
        {
            return License.Status.Licensed;
        }
        /// <summary>
        /// 获取许可证键值信息
        /// </summary>
        private string ReadAdditonalLicenseInformation()
        {
            string rtnStr = string.Empty;
            if (License.Status.Licensed)
            {
                for (int i = 0; i < License.Status.KeyValueList.Count; i++)
                {
                    string key = License.Status.KeyValueList.GetKey(i).ToString();
                    string value = License.Status.KeyValueList.GetByIndex(i).ToString();
                    rtnStr += key + "-" + value + Environment.NewLine;
                }
            }
            return rtnStr;
        }
        /// <summary>
        /// 获取软件锁定信息
        /// </summary>
        /// <returns></returns>
        private string ReadLockMsg()
        {
            string rtnStr = string.Empty;
            //使用持续时间锁
            bool lock_enabled = License.Status.Evaluation_Lock_Enabled;
            License.EvaluationType ev_type = License.Status.Evaluation_Type;
            int time = License.Status.Evaluation_Time;
            int time_current = License.Status.Evaluation_Time_Current;
            rtnStr += string.Format("是否开启持续时间锁:{0},规定使用最大持续时间{1},现在使用时间{2}\n",lock_enabled.ToString(),time.ToString(),time_current.ToString());
            //到期锁
            bool lock_enabled1 = License.Status.Expiration_Date_Lock_Enable;
            System.DateTime expiration_date = License.Status.Expiration_Date;
            rtnStr += string.Format("是否开启到期锁:{0},到期时间{1}\n", lock_enabled1.ToString(), expiration_date.ToShortTimeString());
            //使用次数锁
            bool lock_enabled2 = License.Status.Number_Of_Uses_Lock_Enable;
            int max_uses = License.Status.Number_Of_Uses;
            int current_uses = License.Status.Number_Of_Uses_Current;
            rtnStr += string.Format("是否开启使用次数锁:{0},最大使用次数{1},当前使用次数{2}\n", lock_enabled2.ToString(), max_uses.ToString(), current_uses.ToString());
            //并发运行锁
            bool lock_enabled3 = License.Status.Number_Of_Instances_Lock_Enable;
            int max_instances = License.Status.Number_Of_Instances;
            rtnStr += string.Format("是否限制并行数量:{0},最大并行数量:{1}\n", lock_enabled3, max_instances.ToString());
            //硬件锁
            bool lock_enabled4 = License.Status.Hardware_Lock_Enabled;
            string lic_hardware_id = "";
            if (lock_enabled)
            {
                lic_hardware_id = License.Status.License_HardwareID;
            }
            rtnStr += string.Format("证书是否开启硬件锁{0},对于特定硬件的有效{1}\n", lock_enabled4.ToString(), lic_hardware_id);
            return rtnStr;
        }
        /// <summary>
        /// 获取机器硬件编号
        /// </summary>
        /// <returns></returns>
        private string GetHardwareID()
        {
            return License.Status.HardwareID;
        }
        /// <summary>
        /// 获取许可证适用的硬件编码
        /// </summary>
        /// <returns></returns>
        private string GetLicenseHardwareID()
        {
            return License.Status.License_HardwareID;
        }
        /// <summary>
        /// 作废许可证
        /// </summary>
        private string InvalidateLicense()
        {
            string confirmation_code = License.Status.InvalidateLicense();
            return confirmation_code;
        }
        /// <summary>
        /// 检查作废许可证的验证码是否有效
        /// </summary>
        /// <param name="confirmation_code"></param>
        /// <returns></returns>
        public bool CheckConfirmationCode(string confirmation_code)
        {
            return License.Status.CheckConfirmationCode(License.Status.HardwareID,
            confirmation_code);
        }
        /// <summary>
        /// 重新激活许可证
        /// </summary>
        /// <param name="reactivation_code"></param>
        /// <returns></returns>
        public bool ReactivateLicense(string reactivation_code)
        {
            return License.Status.ReactivateLicense(reactivation_code);
        }其中作废许可证及激活许可证的主要应用场景是:如果许可证开启硬件锁,客户端想从一个机器移动许可证到另一个机器此时就需要先作废许可证,然后在新机器里重新激活许可证。作废许可证可直接调用即可,但是激活许可证需要打开Tools->LicenseReactivation Tool来根据硬件编码生成激活码,传入即可激活许可证。(这里生成激活码我只找到在工具里可视化操作,在代码中找不到这种方法,所以这个应用场景不太适合许可证全自动化的管理)。
本文代码下载地址:http://yunpan.cn/cJnMmILrX9Av2 访问密码 2585
下一篇主要学习下.net reactor的简单应用场景
.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能的更多相关文章
- [转].net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能
		接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. 代码控制许可证的意思就是软件经过.net reactor保护后,到期时客户端就需要购买许可证,这时软件开发商就需要生成 ... 
- .net reactor 学习系列(二)---.net reactor界面各功能说明
		原文:.net reactor 学习系列(二)---.net reactor界面各功能说明 安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ... 
- .net reactor 学习系列(一)---.net reactor介绍
		原文:.net reactor 学习系列(一)---.net reactor介绍 学习.net已经一年多了,从语言的编写到框架类库的运用再到.net三大解决方案的了解(WF,WCF,WPF ... 
- .net reactor 学习系列(四)---.net reactor应用场景
		原文:.net reactor 学习系列(四)---.net reactor应用场景 前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和 ... 
- [转].net reactor 学习系列(二)---.net reactor界面各功能说明
		安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.chm,目前没有中文版本,里面详细介绍了.net reactor的各功能及使用场景.本系列文章是基于此帮助文档 ... 
- Spring学习系列(三) 通过Java代码装配Bean
		上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ... 
- [转].net reactor 学习系列(四)---.net reactor应用场景
		前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和许可证发放场景.如果想应用更高级的场景比如自动化程序许可证的发放及自定义客户端的过期提示等等就需要自己 ... 
- RabbitMQ学习系列三-C#代码接收处理消息
		RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ... 
- MyBatis学习系列三——结合Spring
		目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ... 
随机推荐
- surfingkeys
			https://www.appinn.com/surfingkeys-for-chrome/ 尝试使用.听说能支持js Vimium 不支持拷贝链接的文本. 不支持stop page https:// ... 
- Android(Java) 模拟登录知乎并抓取用户信息
			前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ... 
- golang 操作 Redis & Mysql & RabbitMQ
			golang 操作 Redis & Mysql & RabbitMQ Reids 安装导入 go get github.com/garyburd/redigo/redis import ... 
- text输入框改变事件
			前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onke ... 
- 【u245】机房病毒
			Time Limit: 1 second Memory Limit: 128 MB [问题描述] 我们机房中了病毒,因此几乎什么都无法正常进入.为了解决这个病毒,我们花了好几天.终于在大家的共同努力下 ... 
- NavMesh动态碰撞
			今天遇到一个问题,就是怎样处理一些动态的障碍物. NavMesh是能够躲避静态的障碍物.NavMeshObstacle的作用就是动态添加障碍. 可是有个问题,NavMeshObstacle是圆,连椭圆 ... 
- c++11之初始化列表
			一.前言 C++的学习中.我想每一个人都被变量定义和申明折磨过,比方我在大学笔试过的几家公司.都考察了const和变量,类型的不同排列组合,让你差别有啥不同.反正在学习C++过程中已经被折磨惯 ... 
- SQLite编码
			•SQLite编码 •讲师:李明杰 •技术博客:http://www.cnblogs.com/mjios •SQLite3 •在iOS中使用SQLite3,首先要添加库文件libsqlite3.dyl ... 
- Graphics-Processing Architecture Based on Approximate Rendering
			BACKGROUND The present invention generally relates to the processing of graphics data, and particula ... 
- C#生成二维码,把二维码图片放入Excel中
			/// <summary> /// 把图片保存到excel中 /// </summary> /// <param name="excelFilePath&quo ... 
