如何将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'.

+0

你其实从出口''Calculator.dll' calculate'? – GSerg

+0

@GSerg我不太明白你的意思是从Calculator.dll导出计算。我已经用这个dll的所有C++代码更新了我的问题。 – Arbaaz

你要做的:

extern "C" 
{ 
    CALCULATORSHARED_EXPORT Result calculate(const Input& input) 
    { 
    } 
} 

你并不需要标记CALCULATORSHARED_EXPORT两个结构(InputResult)。

extern "C"否则函数的名称将被损坏,否则CALCULATORSHARED_EXPORT函数将不会被导出。

和C#签名必须是:

public static extern Result calculate(ref Input input); 

因为在C++中,它是一个Input&

那么很显然

result = calculate(ref input); 
+0

完美!谢谢! – Arbaaz

+0

可以请你告诉我什么是C#相当于'std :: vector c;'?我将它与输入结构中的double a和b一起添加到输入中。如果你想要,我可以把它作为一个新问题发布。 – Arbaaz

+1

@Arbaaz没有希望封送一个'vector ''。传递一个数组+数组的长度 – xanatos