c#调用c++dll返回一个(结构体)指针,再将(结构体)指针作为参数传给dll的函数
最近在项目中发现需要在dll中返回一个指针句柄给C#,然后再将指针句柄作为参数,在调用dll的时候传进去。文章没有选择在c#这边重写一个对应的结构体,而是选择使用 Intptr类型 来接受从DLL返回的 (结构体)指针,在网上查阅了好多资料都没发现自己想要的,特此整理一下本次的实现方法,方便后续查阅
本文并不是标准的传参方式,是自己摸索出来的,如果有不对的地方,欢迎大佬指正
dll
创建一个结构体
头文件
**头文件**
#pragma once
#ifdef DLLMAIN_EXPORTS
#define CREATDLL_API __declspec(dllexport)
#else
#define CREATDLL_API __declspec(dllimport)
#endif // CREATDLL_EXPORTS
#include <vector>
struct MyStruct
{
int POS_X, POS_Y;
std::vector<int> StructPoint;
};
extern "C" CREATDLL_API MyStruct * CreatInstance(int x, int y);//创建结构体实例,返回一个结构体指针
extern "C" CREATDLL_API int ChangeStruct(MyStruct* m_Struct,int value,int& x,int& y,int& size);//修改传入的结构体指针的值,做验证
CPP
**cpp**
#include "pch.h"
#include "dllmain.h"
#region 不必理会这一段,项目模板自带的
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#endregion
//头文件实现
MyStruct* CreatInstance(int x, int y)
{
MyStruct* stru = new MyStruct;
stru->POS_X = x;
stru->POS_Y = y;
stru->StructPoint.push_back(x);
stru->StructPoint.push_back(y);
return stru;
}
int ChangeStruct(MyStruct* m_Struct, int value, int& x, int& y, int& size)
{
m_Struct->POS_X += value;
m_Struct->POS_Y += value;
m_Struct->StructPoint.push_back(value);
x = m_Struct->POS_X;
y = m_Struct->POS_Y;
size = m_Struct->StructPoint.size();
return 1;
}
C#调用dll
class demo
{
**创建调用函数**
[DllImport("SampleCode.dll")]
public static extern IntPtr CreatInstance(int x, int y);
[DllImport("SampleCode.dll")]
public static extern int ChangeStruct(IntPtr intPtr, int value, out int x, out int y, out int size);
}
**测试函数**
IntPtr instance;//这个最好放到函数外边,不然容易报错
private void button7_Click(object sender, EventArgs e)
{
int mPOS_X, mPOSY, mSIZE;
instance = demo.CreatInstance(10, 10);
demo.ChangeStruct(instance, 10, out mPOS_X, out mPOSY, out mSIZE);
MessageBox.Show($"指针首次初始化变量值 _X = 10,_Y = 10,通过返回的指针更改值以后的值为 _X = {mPOS_X}, _Y = {mPOSY}, _mSIZE = {mSIZE}");
return;
}
输出结果
以上为整个过程,如果有不对的地方,欢迎指正,非常感谢!