天天看點

.Net使用非托管程式

開發過程中我們或多或少都要使用到非托管元件,例如常見的ActiveX(一般是vb寫的.ocx元件)或Com元件(一般是c++編寫)。我們都知道.Net程式是可以使用托管代碼的,常見的方式大概可以分為兩種:一使用使用DllImport的方式調用直接調用非托管代碼;二使用轉化為"Interop"開頭字尾為".dll"的包裝元件(可以通過vs添加引用[vs會自動生成相應元件放到obj檔案夾中]或者使用 Tlbimp.exe工具來實作)。

對于第一種方式主要用于簡單的調用并且不想用部署ActivX或Com元件的情況下,難點就是根據非托管類型找到對應的托管類型(但是網上介紹了很多方法,包括一些工具來幫助我們解決這個問題)。而對于第二種方法,通過包裝類來解決的優點其實就是使用友善,可是它需要注冊Com元件(使用regsvr32工具)。

對于第二種方式一塊看一個例子吧(第一種我就不再舉例子了,有時間我們再重點看一下):

下面一段代碼是檢查是否插入Usb Key的,UKey的元件本身是ocx控件,通過添加以用UKEYOTPLib在obj中生成一個Interop.UKEYOTPLib.dll來完成對控件的包裝,然後在代碼中就像使用一般托管元件一樣。

using System;

using System.Collections.Generic;

using System.Text;

using UKEYOTPLib;

namespace InvokeUnmanagedCode

{

class Program

{

static void Main(string[] args)

{

OtpUKeyClass ukey = new OtpUKeyClass();

string devicePath=ukey.FindPort(0);

if (ukey.LastErr != 0)//說明沒有找到UKey

{

Console.WriteLine("暫未插入UKey!");

}

else

{

Console.WriteLine("已插入Ukey!");

}

Console.ReadKey();

}

}

}

首先我先不注冊元件試試,結果如下圖提示未找到元件。

.Net使用非托管程式

接着我注冊元件而不插入UKey。

.Net使用非托管程式

插入UKey後

.Net使用非托管程式

注意:注冊元件一般使用Regsvr32工具,像Ukey這種一般都有安裝程式,安裝的過程中會自動注冊。

以上是常用的調用非托管程式的方法,那麼除了這兩種方法是不是還有其他方式呢?那就是通過"加載非托管動态連結庫"的方式來實作。這個個人用的不太多是以也就不再贅餘了。

補充:有時候我們在注冊了元件卻不知道,或者有重複注冊的現象(注意重複注冊的話會有可能因為版本不同給你造成困擾)。既然這樣如何知道所注冊的元件資訊呢?答案就是利用window優化大師。執行:系統清理--ActiveX清理--分析,就可以看到所有已注冊的Com或ActiveX元件。例如下圖我注冊的Usb Key元件資訊。

.Net使用非托管程式

在這裡再給大家介紹一個小技巧:如果你看到了已注冊的資訊想要反注冊而又怕使用指令行麻煩的話,可以先按照window優化大師給出的元件位置,将其放到别處,然後用windows優化大師修複(因為這是指定的位置不存在相應元件,優化大師就認為這是垃圾資訊)就可以将注冊資訊删除。

繼續閱讀