c#呼叫c++ 鏈結庫的方式分為靜態呼叫和動態呼叫這兩種方式。靜態呼叫之前的文章裡面都有介紹,使用.net 提供的dllimport 匯入相關的c++ 庫即可。請看之前的文章, 。
今天介紹動態呼叫的方法。很多時候,dll庫的目錄可能是變化的,或是有些場景,需要根據具體的情況,來動態載入這些dll庫。這樣使用靜態呼叫的方式就很不方便,c#中我們經常通過配置動態的呼叫託管dll,那麼是不是也可以這樣動態呼叫c++動態鏈結呢?
只要通過loadlibrary, getprocess, freelibrary這幾個函式是可以動態呼叫動態鏈結的(它們包含在kernel32.dll中)。
loadlibrary ( string lpfilename):載入指定的動態鏈結庫,並將它對映到當前程序使用的位址空間。載入成功後即可訪問庫內儲存的資源 , 除了loadlibrary 方法,還有乙個類似的 loadlibraryex 方法。
getprocaddress (int hmodule, string lpprocname):getprocaddress函式檢索指定的動態鏈結庫(dll)中的輸出庫函式位址。 如果函式呼叫成功,返回值是dll中的輸出函式位址。 如果函式呼叫失敗,返回值是null。呼叫函式getlasterror ,得到具體的錯誤資訊。
freelibrary ( int hmodule) :釋放指定的動態鏈結庫,它們早先是用loadlibrary api函式裝載的。
getlasterror() : 獲取錯誤資訊
usingsystem;
using
system.io;
using
system.runtime.interopservices;
namespace
irisking.basic.util
//////
將表示函式位址的 intptr 例項轉換成對應的委託
/// public
static
delegate getdelegatefromintptr(intptr address, type t)
//////
將表示函式位址的 int 轉換成對應的委託
/// public
static delegate getdelegatefromintptr(int
address, type t)
//////
載入sdk
/// ///
///public
static
int loadsdk(string
lpfilename)
, errorcode: ");
return
result;
}return0;
}//////
釋放sdk
/// ///
///public
static
int releasesdk(int
handle)
");var result =freelibrary(handle);
var errcode =getlasterror();
loghelper.info($
"freelibrary result:, errorcode: ");
return0;
}return -1
; }
catch
(exception ex)}}
//////
loadlibraryflags
/// public
enum loadlibraryflags : uint
}
定義委託
unmanagedfunctionpointer(callingconvention.stdcall, charset =charset.ansi)]public
delegate
int delegate_ikusbsdk_getversion([in] [out] [marshalas(unmanagedtype.lparray)] byte version);
3. 呼叫函式
//1. 載入sdk
//2. 通過handle 找到相關的函式
ikusbsdk_getversion
", typeof
(delegate_ikusbsdk_getversion));
var result = getversion(version);
通過如上例子,我們可以在c#中動態或者靜態的呼叫c++寫的**了。
posted @
2019-05-06 11:52
章為忠 閱讀(
...)
編輯收藏
C 動態鏈結庫
動態鏈結庫是實現共享函式庫概念的一種方式。擴充套件名為 dll 動態鏈結庫提供了一種方法,使程序可以呼叫不屬於其可執行 的函式。函式的可執行 位於乙個dll檔案中,該dll包含乙個或多個已被編譯,鏈結並與他們的程序分開儲存的函式。dll有助於共享資料和資源,多個應用程式可同時訪問記憶體中的單個dll...
C 動態鏈結庫
通過動態鏈結庫實現呼叫者不需要重新編譯的情況下被呼叫者的更改可生效 被呼叫者標頭檔案str.h ifndef str h define str h include include using namespace std class myclass a enum b static string fun...
C 動態鏈結庫
動態鏈結庫是實現共享函式庫概念的一種方式。擴充套件名為 dll 動態鏈結庫提供了一種方法,使程序可以呼叫不屬於其可執行 的函式。函式的可執行 位於乙個dll檔案中,該dll包含乙個或多個已被編譯,鏈結並與他們的程序分開儲存的函式。dll有助於共享資料和資源,多個應用程式可同時訪問記憶體中的單個dll...