1、編寫乙個簡單的dll
設定為匯出函式,並採用c風格。函式前加extern "c" __declspec(dllexport)。定義函式在退出前自己清空堆疊,在函式前加__stdcall。
新建乙個標頭檔案,在標頭檔案中:
/* 加入任意你想加入的函式定義*/
extern "c" _declspec(dllexport) int _stdcall add(int *x,int *y); // 宣告為c編譯、鏈結方式的外部函式
extern "c" _declspec(dllexport) int _stdcall sub(int x,int y); // 宣告為c編譯、鏈結方式的外部函式
新建乙個.cpp檔案
#include "mydll.h"//貌似這兩個標頭檔案的順序不能顛倒。我試了很多次,但是不能確定。
int add(int *x,int *y)//是否可以理解為,vs2010已經預設是 _stdcall,所以函式不用新增該修飾符
int sub(int x,int y)
把匯出函式名稱變為標準名稱,需加模組定義檔案,就是.def檔案。
內容如下:(需要注釋,前面加分號就可以了,注釋需要單獨行)
library "test"
exports
;add函式
add;sub函式
sublibrary 庫名稱
exports 需要匯出的各個函式名稱
重新編譯之後,再用depends工具看一下,函式已經變成標準add。這個在動態載入時很有用,特別是在getprocaddress函式尋找入庫函式的時候。
2、靜態呼叫
新建乙個c#的控制台專案,
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.runtime.interopservices;//新增
namespace mytest}}
3、動態呼叫
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.runtime.interopservices;//新增
namespace mytest}}
注意:c#時常需要呼叫c/c++dll,當傳遞引數時時常遇到問題,尤其是傳遞和返回字串時。vc++中主要字串型別為:lpstr,lpcstr, lpctstr, string, cstring, lpcwstr, lpwstr等,但轉為c#型別卻不完全相同。
型別對照:
c/c++----------c#
bstr --------- stringbuilder
lpctstr --------- stringbuilder
lpcwstr --------- intptr
handle---------intptr
hwnd-----------intptr
char *----------string
int * -----------ref int
int &-----------ref int
void *----------intptr
unsigned char *-----ref byte
struct需要在c#裡重新定義乙個struct
callback**函式需要封裝在乙個委託裡,delegate static extern int funcallback(string str);
注意在每個函式的前面加上public static extern +返回的資料型別,如果不加public ,函式預設為私有函式,呼叫就會出錯。
在c#呼叫c++ dll封裝庫時會出現兩個問題:
1. 資料型別轉換問題
2. 指標或位址引數傳送問題
C C DLL生成與呼叫例程詳解
為了避免出現問題,請統一使用visual studio 2017 建立乙個dll庫專案,在屬性頁中勾選生成dll 配置型別 在輸出的選擇中選擇release輸出 主要函式和標頭檔案如下 define dlldemoapi declspec dllexport include stdafx.h inc...
C 呼叫方式總結
stdcall stdcall 呼叫約定相當於16位動態庫中經常使用的pascal呼叫約定。在32位的vc 5.0中pascal呼叫約定不再被支援 實際上它已被定義為 stdcall。除了 pascal外,fortran和 syscall也不被支援 取而代之的是 stdcall呼叫約定。兩者實質上是...
C 呼叫C DLL的方式
動態鏈結庫 dll 是乙個包含可由多個程式同時使用的 和資料的庫,dll不是可執行檔案。可以說在windows作業系統中隨處可見,開啟主分割槽盤下的system32。在一些專案中,如果有大量運算或者涉及大量演算法時通常使用c或c 語言封裝成乙個dll,開放一些介面供其他程式呼叫。下面是寫的乙個簡單的...