當前位置:編程學習大全網 - 編程語言 - C#調用mfc的dll後面的接口函數怎麽寫

C#調用mfc的dll後面的接口函數怎麽寫

在使用外部的非.NET托管的DLL的時候,通常妳要知道這個dll中公開了那些接口(壹般情況下只有公開的方法有用)。

例如:在壹個用C語言編寫的用來讀取串口上IC卡讀卡器的dll中公開了如下的方法。

int auto_init(int port,ulong baud);

這個方法是用來自動初始話讀卡器的。我們在C#中就要通過dllImport的方式來使用這個接口。首先程序集要引用using System.Runtime.InteropServices命名空間。然後在我們的程序中聲明要引用的這個方法。

[DllImport("Mwic_32.dll")]

public static unsafe extern int ic_init(int port,ulong baud);

特殊屬性DllImport的構造函數中輸入的是所引用的dll的中文名稱或者全名稱,如果輸入的只是文件名那麽系統會在運行目錄下尋找文件名為指定名稱的程序集。註意聲明的引用必須是static unsafe extern 類型的。其他的形式就跟dll中定義的壹樣。這樣聲明之後,我們就可以在自己的代碼裏面就像調用方法壹樣的使用這個方法了。

在使用的時候,因為我們調用的是壹段非托管代碼,因此就必須在非托管方法中使用,聲明非托管方法的形式如下。

/// <summary>

/// 初始化RD系列通用讀卡器的方法。(本方法調用非托管代碼)

/// </summary>

public unsafe void initMachine()

{

this.opened=true;

this.st=this.icdev=ic_init(this.port,9600);

if(this.st<0)

{

this.error(this.st);

this.opened=false;

return;

}

this.st=this.getState(this.icdev);

if(st<0)

{

this.error(this.st);

this.opened=false;

return;

}

//System.Windows.Forms.MessageBox.Show(this.getCardType());

this.deep(10);

}

註意在聲明非托管方法的時候方法前面必須添加unsafe字段已標明這個方法是非托管的。在這個方法內部所使用的數據類型可以使用C#的類型也能夠使用C或者C++的數據類型。

如果妳只是做壹般性的調用的話,上面的方法就足夠用了。在使用的時候,托管的代碼可以任意調用這些非托管的方法。需要註意的就是在調用非托管代碼時最好做好異常檢測。另外壹個常見的問題就是通常非托管中使用的值類型與托管中的不同,而且經常非托管中的方法的參數使用的都是指針,這時就要註意怎樣將托管類型轉換為指針。例如在上面這個讀卡dll中有壹個int get_status(int icdev,int* state)方法,在這個方法中有壹個參數時壹個指針。聲明這個方法的方式是:

[DllImport("Mwic_32.dll")]

public static unsafe extern int get_status(int icdev,int* state);

在使用這個方法的適合,就可能會出現歧異因為在C#中沒有int*類型,因此我們就要利用C#的表現形式來為這個方法輸入參數,方法如下:

/// <summary>

/// 檢查讀卡器的插卡狀態

/// </summary>

/// <param name="icdev"></param>

/// <returns></returns>

public unsafe int getState(int icdev)

{

int i=2;

int st=RD.get_status(this.icdev,&i);

this.status=i;

return i;

}

  • 上一篇:燈光秀表白如何制作
  • 下一篇:描述壹個人賞花的詩
  • copyright 2024編程學習大全網