C 呼叫C C 建立的非託管動態庫

2021-10-22 04:48:27 字數 1498 閱讀 3624

c#可以呼叫由c/c++語言建立的非託管動態鏈結庫,這需要用到[dllimport("***.dll")],根據msdn上的解釋,**dllimport註解(attribute)**用於指定乙個非託管的動態鏈結庫的匯出函式為靜態入口點。下面引用乙個官方的例子來說明該註解的用法:

using system;

using system.runtime.interopservices;

class

example

}

要點:

為了使用dllimport需要引入兩個命名空間,分別是systemsystem.runtime.interopservices

dllimport有許多字段,其中必不可少的是dllname,該引數是包含非託管方法的動態鏈結庫的檔名。

被註解的匯出方法需要具有externstatic修飾符。

錯誤的使用呼叫約定會導致堆疊不平衡的錯誤,一般來說windows平台上預設呼叫約定為callingconvention.stdcall,也可以使用callingconvention.winapi,它被定義為平台的預設呼叫約定。而標準c語言使用的呼叫約定是callingconvention.cdecl。下面列出了callingconvention的定義:

public

enum callingconvention

c/c++的資料型別和c#有所不同,因此需要注意引數型別的變換。錯誤的選擇引數型別會導致記憶體訪問錯誤。

對於輸入型的unsigned char*char*等型別可以替換為string

對於輸出型的unsigned char*char*等型別可以替換為stringbuilder,注意要在傳參之前構造好。

對於輸出型的int*double*等簡單資料型別的指標,可以考慮替換為相應型別的輸出引數,比如out intout double

要根據動態鏈結庫的型別,選擇專案目標平台,如果弄錯了x86x64則會導致錯誤試圖載入格式不正確的程式

using system;

using system.text;

using system.runtime.interopservices;

namespace filtercontroller

}

c 託管非託管Dll動態呼叫

最近經常看到有人問託管非託管dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多 都實現了dll的靜態呼叫方法。我主要談論下動態庫的動態載入。對於託管動態庫,實現動態載入很簡單。files dwwwing dlldemo.rar code assembly.loadfile filepath 這裡...

託管非託管Dll動態呼叫

最近經常看到有人問託管非託管 dll呼叫的問題。對於動態庫的呼叫其實很簡單。網上很多 都實現了 dll的靜態呼叫方法。我主要談論下動態庫的動態載入。對於託管動態庫,實現動態載入很簡單。files dwwwing dlldemo.rar code assembly.loadfile filepath ...

託管呼叫非託管的DLL

dllimport createnewprocess.dll charset charset.unicode public static extern bool createprocess marshalas unmanagedtype.lpwstr string fullpath 以上是定義入口,...