如何将 struct 从 C# managed 传递到 C++ unmanaged DLL 并获得 struct 结果?
How can I pass struct from C# managed to C++ unmanaged DLL and get struct in result?
我不太了解 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)
{
}
}
这两个结构(Input
和Result
)不需要标记CALCULATORSHARED_EXPORT
。
extern "C"
否则函数名会被破坏,CALCULATORSHARED_EXPORT
否则函数不会被导出
并且 C# 签名必须是:
public static extern Result calculate(ref Input input);
因为在 C++ 中它是 Input&
.
很明显
result = calculate(ref input);
我不太了解 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)
{
}
}
这两个结构(Input
和Result
)不需要标记CALCULATORSHARED_EXPORT
。
extern "C"
否则函数名会被破坏,CALCULATORSHARED_EXPORT
否则函数不会被导出
并且 C# 签名必须是:
public static extern Result calculate(ref Input input);
因为在 C++ 中它是 Input&
.
很明显
result = calculate(ref input);