2011-01-24 22 views
5

Suppongo di dover creare un codice C++ gestito per avvolgere il C++ nativo. Ma ho il problema mentre provo a racchiudere un array usato nel parametro function il cui tipo è definito in C++ nativo. Il codice nativo C++ è la seguente:Come chiamare la classe C++ da C#

//unmanageCPP.h 
class __declspec(dllexport) unmanageMoney 
{ 
public: 
    unmanageMoney(int a, int b) { rmb = a; dollar = b; } 
    unmanageMoney() { rmb = 0; dollar = 0; } 
    int rmb; 
    int dollar; 
}; 

class __declspec(dllexport) unmanageSum 
{ 
public: 
    //how to wrap this funciton? 
    int addDollar(unmanageMoney a[], unmanageMoney b[]); 
}; 

//unmanageCPP.cpp 
#include "unmanaged.h" 

int unmanageSum::adddollar(unmanageMoney a[], unmanageMoney b[]) 
{ 
    return a[0].dollar + b[0].dollar; 
} 

Qualcuno potrebbe dirmi come scrivere il manageCPP.h? Grazie mille!

Aggiornamento

compongo il manageCPP.h come segue, ma non so come scrivere addDollar()

//first, I wrap the class unmanageMoney for use in manageSum::addDollar() 
public ref class manageMoney 
{ 
private: 
    unmanageMoney* mMoney; 
public: 
    unmanageMoney getMoney() 
    { 
     return *mMoney; 
    } 
    manageMoney(int a, int b) { mMoney = new unmanageMoney(a, b); } 
    ~manageMoney() { delete mMoney; } 
}; 

public ref class manageSum 
{ 
    // TODO: Add your methods for this class here. 
private: 
    unmanageSum *mSum; 
public: 
    manageSum() 
    { 
     mSum = new unmanageSum(); 
    } 
    ~manageSum() 
    { 
     delete mSum; 
    } 

    //it must be wrong if I code like this, for unmanageSun::adddollar() only 
    // receives unmanageMoney as arguments. So what should I do? 
    int adddollar(manageMoney a[], manageMoney b[]) 
    { 
      return mSum->adddollar(a, b); 
    } 

}; 
+0

@CDBean Se si dispone di aggiornamenti alla propria domanda o ulteriori dettagli da fornire, si prega di modificare la domanda originale per includere i nuovi dati. – Sampson

+1

Probabilmente vuoi 'cli :: array a' per i tuoi argomenti a' addDollar', questo verrà visualizzato in C# come 'manageMoney [] a'. –

+0

Per 'unmanagedSum :: adddollar', sei sicuro di volere' unmanagedMoney a [] 'e non' const unmanagedMoney & a'? Sembra che vogliate solo il primo elemento dell'array, che potrebbe essere fatto con un riferimento (o un puntatore). –

risposta

1

Si crea un/file sorgente CLI ++ C con

public ref class SomethingOrOther 
{ 
    //... 
}; 

e impostare le opzioni di compilazione per utilizzare l'opzione /clr.

Oltre a ciò, è quasi come scrivere in C++ nativo. #include il file di intestazione per la classe che desideri riutilizzare, creare istanze e chiamare le loro funzioni membro, proprio come il normale C++. Ma qualsiasi cosa all'interno di quello ref class sarà visibile a C#.

E NON mettere __declspec(dllexport) sulla classe. Non mai. È utile per le funzioni, ma crea miseria quando viene utilizzato con le classi.

+0

Grazie per la risposta, ma cosa succede se la funzione membro ha anche il tipo di argomento definito in C++ nativo? Devo anche avvolgere il tipo di argomento? – ChanDon

+0

@CDBean: Sì. Non ha sempre senso avere una mappatura 1: 1 tra tipi nativi e gestiti (a volte può avere senso dividere un parametro struct in più parametri o qualcosa del genere), ma dovrai fornire qualche forma di conversione . –

+0

E non so perché non dovrei mettere __declspec (dllexport) sulla classe. Provo a eliminarlo, ma risulta errato, con l'errore "modulo mancante" – ChanDon