.Net開發筆記(二十)建立一個需要授權的第三方元件

周見智發表於2013-12-20

在使用需要授權的軟體時,註冊付費的目標是軟體的使用者,我們開發人員平時用到的一些第三方元件也是需要授權付費的,也就是說,付費者是開發人員,並不是系統(使用了該第三方元件)的最終使用者。

以上兩者的區別如下圖:

圖1

本篇文章介紹.net中怎樣開發需要授權的第三方控制元件(元件),既然授權物件是開發者,不是終端使用者,那麼授權入口只能提供給開發人員,而不應該提供給終端使用者。另外,一般情況下,元件的一次成功授權只能供一個開發人員使用,因此授權資訊需要跟開發人員的電腦繫結,這個可以通過關聯機器硬體編碼來做到。軟體開發完成釋出後,第三方元件不應該影響使用者的使用,也就是說,釋出後的元件,不能再繫結到具體電腦。總結一下,大概包含以下幾點:

  • 元件的授權收費是針對使用該元件開發軟體的人;
  • 元件的授權跟機器繫結,一次成功的授權只能供一個開發人員使用;
  • 軟體釋出後,元件不能再影響終端使用者,第三方元件的授權入口對終端使用者透明。

要解決以上三點,需要知道很重要的一個概念就是之前系列部落格中介紹的“設計時(Design-Time)”和“執行時(Run-Time)”,以及明白它兩的區別和聯絡。

前面系列部落格得知:

任何一個元件有兩種狀態,即“設計時”和“執行時”,簡單之,元件處在窗體設計器中時,它就處於“設計時”;反之,程式跑起來後,元件就處於“執行時”。同一個元件,處於設計時的行為和處於執行時的行為可能不一樣,這就像同一個人,在他老爸面前和在他兒子面前的行為可能不一樣。用一個簡潔的程式碼展示如下:

 1 class 元件
 2 {
 3 public 元件()
 4 {
 5     if(設計時)
 6     {
 7          //do something while design-time
 8     }
 9     else
10     {
11          //do something while run-time
12     }
13 }
14 public void DoSomething()
15 {
16    if(設計時)
17 {
18     //do something while design-time
19 }
20 else
21 {
22    //do something while run-time
23 }
24 }
25 }
View Code

如上程式碼所示,軟體開發階段,開發人員使用第三方元件,需要在窗體設計器中例項化一個元件例項,那麼這時候就可以檢查元件在當前機器上的授權狀態(已授權、試用期還是已過期),這時候檢查授權狀態需要和當前機器硬體資訊關聯。軟體釋出後,元件不再在窗體設計器中,同時元件面向的是終端使用者,理論上不應該再檢查元件的授權狀態,但是為了防止開發人員使用試用期的元件釋出了軟體,因此在元件釋出後,還是有必要檢查一下元件的授權狀態,這時候檢查方式就不用與硬體資訊關聯了。

本篇Demo中做了一個等待控制元件,我們在使用它進行開發的時候需要取得授權許可,授權時根據生成的申請碼(跟本機硬碟編號關聯),去匹配元件開發商提供的啟用碼,兩者一致的話,授權成功,否則提供30天的試用期,在試用階段,介面顯示試用標誌,30天試用結束後,元件不能再繼續試用。如果需要釋出,則需要呼叫元件對應的方法,給它提供一個申請碼和一個啟用碼,授權成功,元件正常使用,授權不成功,元件顯示未授權標誌(但不要求終端使用者獲得授權)。

判斷元件當前狀態方法:

 1  /// <summary>
 2         /// 檢查元件狀態
 3         /// </summary>
 4         void CheckStatus()
 5         {
 6             ISelectionService isp = GetService(typeof(ISelectionService)) as ISelectionService; //獲取服務
 7 //同一個元件 處於不同狀態下 有不同的行為
 8             if (isp == null) //元件處於釋出時(或者執行時 run-time)
 9             {
10 //什麼都不幹
11             }
12             else //元件處於開發時(或者設計時 design-time)
13             {
14                 if (AuthorizeHelper.CheckActivateCode(Properties.Settings.Default.ActivateCode, LocalMachine.GetAskCode())) //檢查是否已授權
15                 {
16                     currentStatus = 1; //開發時已授權
17                 }
18                 else
19                 {
20                     using (frmAuthority frma = new frmAuthority()) //授權對話方塊
21                     {
22                         if (frma.ShowDialog() == DialogResult.OK) //授權成功
23                         {
24                             currentStatus = 1;
25                         }
26                         else
27                         {
28                             if ((DateTime.Now - Properties.Settings.Default.TrialStart).TotalDays >= 30) //判斷試用是否到期
29                             {
30                                 //拋異常
31                                 throw new Exception("ProgressBar元件未授權!");
32                             }
33                             else
34                             {
35                                 currentStatus = 0; //開發時試用
36                             }
37                         }
38                     }
39                 }
40             }
41         }
View Code

釋出後,提供申請碼和啟用碼啟用元件:

 1 /// <summary>
 2         /// 釋出時授權入口
 3         /// </summary>
 4         /// <param name="askCode"></param>
 5         /// <param name="activateCode"></param>
 6         public void UnLock(string askCode, string activateCode)
 7         {
 8             if (AuthorizeHelper.CheckActivateCode(activateCode, askCode)) //判斷是否合法
 9             {
10                 currentStatus = 3; //開發時(執行時)已授權
11             }
12             else
13             {
14                 currentStatus = 2; //開發時(執行時)試用
15             }
16         }
View Code

注:本文主要講述第三方元件授權原理,其餘有關授權方式是否安全等有待完善。

Demo專案結構:

圖2

效果圖:

1)開發階段,元件授權介面

圖3

2)開發階段,ProgressBar試用期

圖4

3)釋出後,未授權的ProgressBar

圖5

4)開發階段,授權成功

圖6

原始碼下載地址:http://files.cnblogs.com/xiaozhi_5638/ComponentCopyProtection.rar

希望有幫助!

 

相關文章