在使用需要授权的软件时,注册付费的目标是软件的使用者,我们开发人员平时用到的一些第三方组件也是需要授权付费的,也就是说,付费者是开发人员,并不是系统(使用了该第三方组件)的最终使用者。

以上两者的区别如下图:

图1

本篇文章介绍.net中怎样开发需要授权的第三方控件(组件),既然授权对象是开发者,不是最终用户,那么授权入口只能提供给开发人员,而不应该提供给最终用户。另外,一般情况下,组件的一次成功授权只能供一个开发人员使用,因此授权信息需要跟开发人员的电脑绑定,这个可以通过关联机器硬件编码来做到。软件开发完成发布后,第三方组件不应该影响用户的使用,也就是说,发布后的组件,不能再绑定到具体电脑。总结一下,大概包含以下几点:

  • 组件的授权收费是针对使用该组件开发软件的人;
  • 组件的授权跟机器绑定,一次成功的授权只能供一个开发人员使用;
  • 软件发布后,组件不能再影响最终用户,第三方组件的授权入口对最终用户透明。

要解决以上三点,需要知道很重要的一个概念就是之前系列博客中介绍的“设计时(Design-Time)”和“运行时(Run-Time)”,以及明白它两的区别和联系。

前面系列博客得知:

任何一个组件有两种状态,即“设计时”和“运行时”,简单之,组件处在窗体设计器中时,它就处于“设计时”;反之,程序跑起来后,组件就处于“运行时”。同一个组件,处于设计时的行为和处于运行时的行为可能不一样,这就像同一个人,在他老爸面前和在他儿子面前的行为可能不一样。用一个简洁的代码展示如下:

 class 组件
{
public 组件()
{
if(设计时)
{
//do something while design-time
}
else
{
//do something while run-time
}
}
public void DoSomething()
{
if(设计时)
{
//do something while design-time
}
else
{
//do something while run-time
}
}
}

如上代码所示,软件开发阶段,开发人员使用第三方组件,需要在窗体设计器中实例化一个组件实例,那么这时候就可以检查组件在当前机器上的授权状态(已授权、试用期还是已过期),这时候检查授权状态需要和当前机器硬件信息关联。软件发布后,组件不再在窗体设计器中,同时组件面向的是最终用户,理论上不应该再检查组件的授权状态,但是为了防止开发人员使用试用期的组件发布了软件,因此在组件发布后,还是有必要检查一下组件的授权状态,这时候检查方式就不用与硬件信息关联了。

本篇Demo中做了一个等待控件,我们在使用它进行开发的时候需要取得授权许可,授权时根据生成的申请码(跟本机硬盘编号关联),去匹配组件开发商提供的激活码,两者一致的话,授权成功,否则提供30天的试用期,在试用阶段,界面显示试用标志,30天试用结束后,组件不能再继续试用。如果需要发布,则需要调用组件对应的方法,给它提供一个申请码和一个激活码,授权成功,组件正常使用,授权不成功,组件显示未授权标志(但不要求最终用户获得授权)。

判断组件当前状态方法:

  /// <summary>
/// 检查组件状态
/// </summary>
void CheckStatus()
{
ISelectionService isp = GetService(typeof(ISelectionService)) as ISelectionService; //获取服务
//同一个组件 处于不同状态下 有不同的行为
if (isp == null) //组件处于发布时(或者运行时 run-time)
{
//什么都不干
}
else //组件处于开发时(或者设计时 design-time)
{
if (AuthorizeHelper.CheckActivateCode(Properties.Settings.Default.ActivateCode, LocalMachine.GetAskCode())) //检查是否已授权
{
currentStatus = ; //开发时已授权
}
else
{
using (frmAuthority frma = new frmAuthority()) //授权对话框
{
if (frma.ShowDialog() == DialogResult.OK) //授权成功
{
currentStatus = ;
}
else
{
if ((DateTime.Now - Properties.Settings.Default.TrialStart).TotalDays >= ) //判断试用是否到期
{
//抛异常
throw new Exception("ProgressBar组件未授权!");
}
else
{
currentStatus = ; //开发时试用
}
}
}
}
}
}

发布后,提供申请码和激活码激活组件:

 /// <summary>
/// 发布时授权入口
/// </summary>
/// <param name="askCode"></param>
/// <param name="activateCode"></param>
public void UnLock(string askCode, string activateCode)
{
if (AuthorizeHelper.CheckActivateCode(activateCode, askCode)) //判断是否合法
{
currentStatus = ; //开发时(运行时)已授权
}
else
{
currentStatus = ; //开发时(运行时)试用
}
}

注:本文主要讲述第三方组件授权原理,其余有关授权方式是否安全等有待完善。

Demo项目结构:

图2

效果图:

1)开发阶段,组件授权界面

图3

2)开发阶段,ProgressBar试用期

图4

3)发布后,未授权的ProgressBar

图5

4)开发阶段,授权成功

图6

源码下载地址:http://files.cnblogs.com/xiaozhi_5638/ComponentCopyProtection.rar

希望有帮助!

.Net开发笔记(二十)创建一个需要授权的第三方组件的更多相关文章

  1. Java学习笔记二十九:一个Java面向对象的小练习

    一个Java面向对象的小练习 一:项目需求与解决思路: 学习了这么长时间的面向对象,我们只是对面向对象有了一个简单的认识,我们现在来做一个小练习,这个例子可以使大家更好的掌握面向对象的特性: 1.人类 ...

  2. twisted 学习笔记二:创建一个简单TCP客户端

    #coding=utf-8 from twisted.internet import reactor,protocol class QuickClient(protocol.Protocol): de ...

  3. linux驱动开发学习二:创建一个阻塞型的字符设备

    在Linux 驱动程序中,可以使用等待队列来实现阻塞进程的唤醒.等待队列的头部定义如下,是一个双向列表. struct list_head { struct list_head *next, *pre ...

  4. 微信小程序开发(二)创建一个小程序页面

    为了方便讲解,我们将上篇博客创建的小程序除了project.config.json和sitemap.json两个文件保留,其他全部删除(这两个文件存的是小程序的创建信息,删掉会有报错提示). 接下来我 ...

  5. Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件

    前言   上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤.   受限制   因为直接配置sample的vi比较麻烦 ...

  6. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  7. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  8. Django开发笔记二

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.xadmin添加主题.修改标题页脚和收起左侧菜单 # ...

  9. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

随机推荐

  1. RHEL6.5安装11.2.0.3 RAC并打补丁

    [TOC] 一,主机配置 1.修改hosts文件(两节点) #127.0.0.1 localhost localhost.localdomain localhost4 localhost4.local ...

  2. 解决poshytip 表单高度大于屏幕高端 显示问题

    Poshy Tip是一款非常友好的信息提示工具,它基于jQuery,当鼠标滑向链接时,会出现一个信息提示条.信息的内容直接可以在HTML里设定也可以是从服务端调用的数据,该插件还提供了很多属性和方法. ...

  3. 关于 js 一些基本的东西

    r.js 可以打包(可以实现前端文件的压缩与合并). 客户端尽量遵循 amd 规范. 推荐使用 requirejs 规范. requirejs 简单教程: http://www.runoob.com/ ...

  4. 安装sqoop

    安装sqoop 1.默认已经安装好java+hadoop 2.下载对应hadoop版本的sqoop版本 3.解压安装包 tar zxvf sqoop-1.4.6.bin__hadoop-2.0.4-a ...

  5. 用js把数据从一个页面传到另一个页面

    用js把数据从一个页面传到另一个页面的层里? 如果是传到新页面的话,你网站基于什么语言开发直接用get或者post获取,然后输出到这个层 通过url传参 如果是HTML页面的话JS传到新页面就wind ...

  6. 每天一个linux命令--定时启动

    1.设置启动的时间,输入crontab -e命令 设置一种编辑器,进入编辑界面,设置启动的时间为每5分钟启动一次wanghy.sh脚本 # m h dom mon dow command # */ * ...

  7. jQuery插件开发(溢出滚动)

    声明:此程序仅针对手机端,简单的封装一个插件,意在记载插件的开发过程,如有错误及不足之处,还望即时指出. 移动开发的时候,我们经常会遇到滑动事件,众所周知手机端滑动主要依靠touch事件.最近接连遇到 ...

  8. PLSQL配置新的oracle实例

    在Win环境下的Oracle中,D:\Oracle\product\10.1.0\db_1\NETWORK\ADMIN\tnsnames.ora文件很重要,它作用是:本地命名的配置.本地名可以用简单的 ...

  9. asp.net mvc引用控制台应用程序exe

    起因:有一个控制台应用程序和一个web程序,web程序想使用exe程序的方法,这个时候就需要引用exe程序. 报错:使用web程序,引用exe程序 ,vs调试没有问题,但是部署到iis就报错,如下: ...

  10. 关于.9.png格式图片的制作与使用

    .9.png图片其实就是png格式图片,不过它比普通的png图片外围多了1px(像素)的边框,另外就是使用这种格式的图片可以实现背景自适应大小且不失真的效果. 制作使用步骤: 1.制作属于你自己的pn ...