本文將為大家講述DLL庫自動注冊的兩種方法包括調用Regsvr方法等希望通過本文能對大家有所幫助
盡管MS為我們提供了豐富的NET Framework庫我們的程序C#開發帶來了極大的便利但是有時候一些特定功能的控件庫還是需要由第三方提供或是自己編寫當需要用到Dll引用的時候我們通常會通過添加引用的方式將它們納入到項目中然後就可以像使用自己的類一樣方便的使用它們了但是有些Dll庫(OCX)文件是需要注冊到Windows注冊表後才能正常添加和使用的本文介紹兩種為Dll庫(OCX)自動注冊的方法為大家提供參考
首先大家都知道在Windows的運行中輸入Regsvrexe 路徑這樣的方法來手動注冊Dll控件(OCX)顯示這種方法對於程序的自動化部署等帶來極大的不便因此今天我們著重介紹如何用C#實現自動注冊
方法一調用Regsvr法
既然可以在運行欄中輸入Regsvrexe 路徑的方法來注冊那麼一定可以在C#程序中采用同樣的方法來調用Regsvr以實現注冊
Process p = new Process();
pStartInfoFileName = Regsvrexe;
pStartInfoArguments = /s C:\\DllTestdll;
//路徑中不能有空格 pStart(); 采用這種方法注意要添加對命名空間SystemDiagnostics的引用
using SystemDiagnostics; 另外這種方法有一個不足之處那就是注冊工作是在本程序之外由Regsvrexe程序來完成的系統內不方便知道注冊的結果也不方便對注冊過程彈出的對話框進行自定義和控制這裡附Regsvr的參數說明(感謝網友伍華聰的提醒)
regsvrexe是位系統下使用的DLL注冊和反注冊工具使用它必須通過命令行的方式使用格式是
regsvr [/u] [/s] [/n] [/i[:cmdline]] DLL文件名
命令可以在開始→運行的文本框中也可以事先在bat批處理文檔中編寫好命令未帶任何參數是注冊DLL文件功能其它參數對應功能如下
/u反注冊DLL文件;
/s安靜模式(Silent)執行命令即在成功注冊/反注冊DLL文件前提下不顯示結果提示框
/c控制端口;
/i在使用/u反注冊時調用DllInstall;
/n不調用DllRegisterServer必須與/i連用
方法二調用DllRegisterServer函數法
既然方法一不大實用那麼我們就來尋找一種真正實用的方法來達到我們的目的吧研究Regsvrexe和Dll文件我們會發現其實每個需要注冊的文件都包括一個DllRegisterServer()方法Regsvrexe就是通過調用該方法來完成Dll的注冊的呵呵知道了這個我們就可以自己調用DllRegisterServer()來完成注冊過程啦
首先還得引入外部方法
[DllImport(DllTestdll)] public static extern int DllRegisterServer();//注冊時用 [DllImport(DllTestdll)] public static extern int DllUnregisterServer();//取消注冊時用 接下來就不難啦
int i = DllRegisterServer(); if (i >= )
{
//注冊成功!
}
else
{
//注冊失敗} 取消注冊的過程就不應再貼代碼啦
兩種方法介紹完啦可是好像還缺點什麼?對了那就是對Dll是否已經注冊過了的判斷一般情況下我們可以將對Dll控件的注冊過程放在系統啟動的過程中來完成但是總不能每次啟動都注冊一次吧?這樣做顯然不合理那麼我們就來判斷一下當前Dll是否已經注冊過如果已注冊過就跳過注冊過程
每一個Dll的注冊都會在注冊表裡記錄下有關它本身的資料如注冊路徑唯一ID等我們這裡就是利用它留下的唯一ID號來判斷
RegistryKey rkTest = RegistryClassesRootOpenSubKey(CLSID\\{FADEBAAFFBBDCAB}\\);
if (rkTest == null){
//Dll沒有注冊在這裡調用DllRegisterServer()吧} 注意要添加對命名空間MicrosoftWin的引用
using MicrosoftWin;
其中的{FADEBAAFFBBDCAB}就是該Dll的唯一ID啦每一個Dll文件都會不一樣的但是問題又來了怎麼樣知道它的唯一ID呢?其實很簡單那就是逆向思維我們可先注冊這個Dll文件然後到注冊表的HKEY_CLASSES_ROOT\CLSID分支下查找Dll的名稱或路徑就可以看到這個ID啦簡單我就不多說啦
From:http://tw.wingwit.com/Article/program/net/201311/12168.html