在使用需要授權的軟體時,註冊付費的目標是軟體的使用者,我們開發人員平時用到的一些第三方元件也是需要授權付費的,也就是說,付費者是開發人員,並不是系統(使用了該第三方元件)的最終使用者。
以上兩者的區別如下圖:
圖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 }
如上程式碼所示,軟體開發階段,開發人員使用第三方元件,需要在窗體設計器中例項化一個元件例項,那麼這時候就可以檢查元件在當前機器上的授權狀態(已授權、試用期還是已過期),這時候檢查授權狀態需要和當前機器硬體資訊關聯。軟體釋出後,元件不再在窗體設計器中,同時元件面向的是終端使用者,理論上不應該再檢查元件的授權狀態,但是為了防止開發人員使用試用期的元件釋出了軟體,因此在元件釋出後,還是有必要檢查一下元件的授權狀態,這時候檢查方式就不用與硬體資訊關聯了。
本篇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 }
釋出後,提供申請碼和啟用碼啟用元件:
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 }
注:本文主要講述第三方元件授權原理,其餘有關授權方式是否安全等有待完善。
Demo專案結構:
圖2
效果圖:
1)開發階段,元件授權介面
圖3
2)開發階段,ProgressBar試用期
圖4
3)釋出後,未授權的ProgressBar
圖5
4)開發階段,授權成功
圖6
原始碼下載地址:http://files.cnblogs.com/xiaozhi_5638/ComponentCopyProtection.rar
希望有幫助!