PDA

View Full Version : [C++/C#] wrapper classe C++ da usare in C#


andreapav
17-11-2015, 10:27
Ciao a tutti.

Come posso creare un wrapper per una classe C++ (o meglio per dei suoi metodi) da usare in C#?
So che potrei usare C++/CLI ma volevo evitare, so anche che posso esportare con extern __declspec(dllexport) solo metodi statici..
Volevo esportare metodi statici che però usano una classe c++ ma ho problemi di linker.

Questo è il mio header:

CPPC *icpp;

extern "C"
{
// esempio di metodo puramente statico
__declspec(dllexport) int __cdecl StaticMethod (int a, int b);

//
__declspec(dllexport) bool __cdecl Init ();
__declspec(dllexport) bool __cdecl Test_1 (int value);
__declspec(dllexport) bool __cdecl Destroy ();
}

questa è l'implementazione:

// esempio di metodo puramente statico
int StaticMethod (int value1, int value2)
{
return value1 + value2;
}

// metodi che si appoggiano su oggetto
bool Init()
{
icpp = new CPPC();
return true;
}

bool Destroy()
{
icpp->~CPPC();
return true;
}

bool Test_1(int value)
{
if (icpp->Test_1(value)) // RIGA CHE DA PROBLEMI DI LINKER
return true;
return false;
}

ho: LNK2019 e LNK1120.

Sto sbagliando così di tanto??
Grazie!

tomminno
18-11-2015, 10:20
Ma la definizione di CPPC qual è? Così senza maggiori dettagli sembrerebbe che il linker non trovi l'implementazione di Test_1 per CPPC.

Qui il problema mi pare a monte dell'interfacciamento C++/C#.
Comunque per far comunicare i 2 mondi le possibilità sono:

Platform Invoke
COM
C++/CLI

andreapav
19-11-2015, 07:44
Ciao. Il metodo è definito.
Il codice di CPPC è:

#pragma once

class CPPC
{
public:
CPPC(void);
~CPPC(void);

//private:
bool Test_1(int);

int Test_Property_Get();
void Test_Property_Set(int);
};

Classe e wrapper sono nello stesso progetto per cui il linker non dovrebbe avere problemi nel trovare il .lib ...credo...

Ah, naturalmente il wrapper include l'header di CPPC:
#pragma once
#include "CPPC.h"

CPPC *icpp;

extern "C"
...

andreapav
20-11-2015, 10:42
In CPPC.cpp avevo dichiarato il metodo senza indicare il nome della classe!!
Mancava "CPPC::"...

CPPC::SMT2_CPP(void)
{
}


CPPC::~SMT2_CPP(void)
{
}

// --

bool CPPC::Test_1(int val)
{
return (val > 0);
}

int CPPC::Test_Property_Get()
{
return 1;
}

void CPPC::Test_Property_Set(int val)
{
//return 1;
}