如何将C#托管的结构传递给C++非托管DLL并在结果中获取结构体?
问题描述:
我不太了解C++,所以我添加了所有的dll代码。如何将C#托管的结构传递给C++非托管DLL并在结果中获取结构体?
C++ ** ** Calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include "global.h"
struct CALCULATORSHARED_EXPORT Input {
double a;
double b;
};
struct CALCULATORSHARED_EXPORT Result {
double sum;
double diff;
double prod;
double div;
};
global.h
#ifndef CALCULATOR_GLOBAL_H
#define CALCULATOR_GLOBAL_H
#if defined(CALCULATOR_EXPORTS)
# define CALCULATORSHARED_EXPORT __declspec(dllexport)
#else
# define CALCULATORSHARED_EXPORT __declspec(dllimport)
#endif
#endif // CALCULATOR_GLOBAL_H
calculator.h
#include "calculator.h"
Result calculate(const Input& input) {
Result result;
result.sum = input.a + input.b;
result.diff = input.a - input.b;
result.prod = input.a * input.b;
result.div = input.a/input.b;
return result;
}
C#
[DllImport("Calculator.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern Result calculate(Input input);
[StructLayout(LayoutKind.Sequential)]
public struct Input
{
public double a;
public double b;
};
[StructLayout(LayoutKind.Sequential)]
public struct Result
{
public double sum;
public double diff;
public double prod;
public double div;
};
private void button1_Click(object sender, EventArgs e)
{
Input input;
Result result;
input.a = 5;
input.b = 6;
result = calculate(input);
}
我越来越Unable to find an entry point named 'calculate' in DLL 'Calculator.dll'.
答
你要做的:
extern "C"
{
CALCULATORSHARED_EXPORT Result calculate(const Input& input)
{
}
}
你并不需要标记CALCULATORSHARED_EXPORT
两个结构(Input
和Result
)。
该extern "C"
否则函数的名称将被损坏,否则CALCULATORSHARED_EXPORT
函数将不会被导出。
和C#签名必须是:
public static extern Result calculate(ref Input input);
因为在C++中,它是一个Input&
。
那么很显然
result = calculate(ref input);
你其实从出口''Calculator.dll' calculate'? – GSerg
@GSerg我不太明白你的意思是从Calculator.dll导出计算。我已经用这个dll的所有C++代码更新了我的问题。 – Arbaaz