無聊之作 C 呼叫C dll

2021-10-01 10:49:16 字數 1914 閱讀 3790

最近由於實習工作需要,要搞一些工程化的東西,為了計算效率等原因我們的演算法是通過c++實現的,而最後的影象化軟體介面是軟工用c#完成的,因此需要提供我們c++的介面dll給他們軟工使用c#進行呼叫

1.c++ dll生成

新建——專案——win32控制台程式——然後取個名字——確定——下一步——選擇dll——勾選空白專案

參見:

#pragma once

#define detect_dll_exports

#ifdef detect_dll_exports

#define detect_dll_api __declspec(dllexport)

#else

#define detect_dll_api __declspec(dllimport)

#endif

#include using namespace std;

#ifdef __cplusplus

extern "c"

#endif

其中c++中的標頭檔案如上所示

#include"add.h"

void init(char *config_path)

double read(double *arrayheight, int i, int j, int row, int col)

int add(int a,int b)

bool result(double height, double maxheight, double minheight)

c++**實現在add.cpp中

2.c#呼叫dll

c#呼叫c++dll不需要c++的標頭檔案和lib檔案,只需要dll檔案即可,將dll檔案複製到c#工程執行exe檔案所在的路徑下

然後在c#中需要宣告

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

public static extern void init(string config_path);

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

[return: marshalas(unmanagedtype.i1)]

public static extern bool result(double height, double maxheight, double minheight);

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

public static extern double read(double[,] arrayheight, int i, int j, int row, int col);

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

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

從宣告中就可以看到如何使用這些函式

1、c++中的char *型別可以在c#中直接使用string型別傳入,

2、c#的陣列如double[,] arrayheight可以直接在c++中使用double *型別接受,但是需要確定該陣列的長寬,防止c++中指標越界

3、最值得注意的是,如果在c++中返回bool型別,需要新增[return: marshalas(unmanagedtype.i1)]這一行,否則在c#中會接受錯誤的數值

還有就是,在進行c#和c++ dll之間的傳輸的時候,不能傳輸物件等高階型別,容易出錯,最好只使用陣列和基礎型別

C 呼叫C Dll例程

form1.cs內容 using system using system.windows.forms using system.runtime.interopservices using system.text 申明dll中函式 dllimport kb dll.dll entrypoint inp...

C 呼叫C DLL 總結

當然在c 這樣定義之前要定義結構體,結構體的變數,函式要一樣。c 中的結構體是這樣的 struct stlencodedeviceinfo c 中的定義 structlayout layoutkind.sequential,charset charset.unicode public struct ...

C 呼叫 C dll,同時c 呼叫c

筆者解決這兩個問題,花了很長一段時間,網上提供能正常執行的沒有找到,不過一邊東拼西湊,一邊靠朦還是解決了。先貼上 dllimport c users administrator.sc 201901090132 desktop opengl dll3 release dll3 dll3.dll ent...