最近由於實習工作需要,要搞一些工程化的東西,為了計算效率等原因我們的演算法是通過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...