如何将 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)
    {
    }
}

这两个结构(InputResult)不需要标记CALCULATORSHARED_EXPORT

extern "C"否则函数名会被破坏,CALCULATORSHARED_EXPORT否则函数不会被导出

并且 C# 签名必须是:

public static extern Result calculate(ref Input input);

因为在 C++ 中它是 Input&.

很明显

result = calculate(ref input);