C 和C 對DLL的生成和呼叫

2021-07-25 20:39:14 字數 2539 閱讀 5808

一、 c++呼叫c++生成的dll

1. 生成dll,使用mfc dll選項生成乙個dll工程

step 1

在cpp檔案中新增

extern "c" int _cdecl add(int d1, int d2)

extern "c" int _stdcall sub(int d1, int d2)

step2

在.h檔案中新增

#define dllexport extern "c" __declspec(dllexport)

dllexport int _cdecl add(int d1, int d2);

dllexport int _stdcall sub(int d1, int d2);

step3

增加乙個給呼叫者使用的.h檔案,在檔案中新增

#define dllimport extern "c" __declspec(dllimport)

dllimport int _cdecl add(int d1, int d2);

dllimport int _stdcall sub(int d1, int d2);

2.  新建乙個普通工程,把之前的.h、.dll、.lib檔案拷貝至目標資料夾內

step1 新增.h檔案至工程資料夾中

step2 將.lib檔案引用至工程中

step3  #include ".h"檔案

step4 呼叫.h中的函式

二、 c#呼叫c++生成的dll

1. 生成dll,使用mfc dll選項生成乙個dll工程

step1 

在cpp中新增

extern "c" int _cdecl add(int d1, int d2)

extern "c" int _stdcall sub(int d1, int d2)

extern "c" int _cdecl multiple(int a,int b)

extern "c" int _stdcall divide(int a,int b)

else

}step2

在.h中新增

#define dllexport extern "c" __declspec(dllexport)

dllexport int _cdecl add(int d1, int d2);

dllexport int _stdcall sub(int d1, int d2);

extern "c" int _cdecl multiple(int a,int b);

extern "c" int _stdcall divide(int a,int b);

step3在.def中新增

exports

; 此處可以是顯式匯出

multiple

divide

2.  新建乙個普通工程,把之前的.h、.dll、.lib檔案拷貝至目標資料夾內

step1

新增乙個類,在這個類中將需要用到的函式引用進來

[dllimport("dllexport.dll", entrypoint = "add", callingconvention = callingconvention.cdecl)]

public static extern int add(int a, int b);

[dllimport("dllexport.dll", entrypoint = "sub", callingconvention = callingconvention.stdcall)]

public static extern int sub(int a, int b);

[dllimport("dllexport.dll", entrypoint = "multiple", callingconvention = callingconvention.cdecl)]

public static extern int multiple(int a, int b);

[dllimport("dllexport.dll", callingconvention = callingconvention.stdcall)]

public static extern int divide(int a, int b);

step2

使用新建的類中引入的函式

三、 關於兩種呼叫方式

無論那種呼叫方式,為了保證生成函式的名稱不變化需要加上extern "c" 

使用c++呼叫c++生成的dll時,這裡都是採用的隱式呼叫方法,使用了extern "c" __declspec(dllexport)和extern "c" __declspec(dllimport)

來呼叫dll,add方法使用了_cdecl呼叫方式,sub方法使用了_stdcall呼叫方式

使用c#呼叫c++生成的dll時,也是採用了隱式呼叫方法,除了使用extern "c" __declspec(dllexport)和extern "c" __declspec(dllimport)外

還使用了標準的_cdecl/_stdcall呼叫方式,使用標準的方式時需要在.def檔案中記錄使用的函式名稱

C 呼叫C 生成的dll

本文將介紹c 中通過dll來呼叫c 首先建立c 的 類庫 工程cshapedll。然後輸入如下 csharp view plain copy c 通過dll呼叫c by morewindows using system using system.collections.generic using s...

C 生成dll呼叫

用visual c 生成的dll檔案已經和以前的dll檔案有了本質上的區別。用visual c 生成的dll檔案在程式設計中更多的表現為一種類 class 或者類庫 class library 製作乙個元件 1.首先建立乙個新類庫工程檔案 file new project visual c proj...

C 呼叫外部C 生成DLL

生成dll c 檔案部分內容 h檔案 外部呼叫函式宣告 pragma once ifndef kinectdatagenerator h define kinectdatagenerator h initialize kinect extern c declspec dllexport void k...