2017-03-09 1 views
0

Je ne comprends pas beaucoup C++ donc j'ajoute tout le code à partir duquel dll a été faite.Comment puis-je passer struct de C# managé en C++ non géré DLL et obtenir struct dans le résultat?

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);  
     } 

Je reçois Unable to find an entry point named 'calculate' in DLL 'Calculator.dll'.

+0

Êtes-vous en fait l'exportation '' calculate' de Calculator.dll'? – GSerg

+0

@GSerg Je ne comprends pas très bien ce que vous voulez dire en exportant calculer à partir de Calculator.dll. J'ai mis à jour ma question avec tout le code C++ à partir duquel cette DLL a été faite. – Arbaaz

Répondre

1

Vous devez faire:

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

Vous n'avez pas besoin de marquer CALCULATORSHARED_EXPORT les deux structures (Input et Result).

Le extern "C" sinon le nom de la fonction sera altéré, le CALCULATORSHARED_EXPORT sinon la fonction ne sera pas exportée.

Et la signature C# doit être:

public static extern Result calculate(ref Input input); 

car en C++ est un Input&.

Il est donc clair

result = calculate(ref input); 
+0

Parfait! Je vous remercie! – Arbaaz

+0

pouvez-vous s'il vous plaît dites-moi quel serait l'équivalent C# de 'std :: vector < double > c;'? Je l'ajoute à l'entrée avec double a et b dans la structure d'entrée. Je peux l'afficher comme une nouvelle question si vous le voulez. – Arbaaz

+1

@Arbaaz aucun espoir de marshaling un 'vecteur <>'. Passez un tableau + longueur du tableau – xanatos