chiamando il codice gestito da codice non gestito
Domanda
Voglio chiamare il mio codice .NET da C ++ non gestito. Il mio punto di accesso al processo è basato su .NET, quindi non devo preoccuparmi di ospitare il CLR. So che può essere fatto utilizzando i wrapper COM per gli oggetti .NET, ma vorrei accedere ai singoli metodi statici delle classi gestite, quindi COM non è il mio percorso più breve / più semplice.
Grazie!
Soluzione
Supponendo che tu stia parlando di vero codice non gestito - non solo di C ++ nativo in esecuzione in un assembly in modalità mista compilato con / clr - il modo più semplice è creare un wrapper per il tuo codice .NET in C ++ / CLI. È quindi possibile esportare i metodi C ++ / CLI semplicemente contrassegnandoli con __declspec (dllexport).
In alternativa, se si ha il controllo sull'invocazione del codice non gestito, è possibile eseguire il marshalling dei puntatori di funzione ai metodi .NET e passarli al codice non gestito.
Altri suggerimenti
Guarda questa soluzione: https://sites.google.com/site/robertgiesecke/Home/uploads/ unmanagedexports La soluzione consente di chiamare la funzione C # da C decorando la funzione con l'attributo [DllExport] (opposto a P / Invoke DllImport).
Exmaple:
codice C #
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
Codice C:
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
Output:
The solution is found!!! Z is 15
Aggiorna : c'è una domanda e una buona risposta nei commenti:
Come posso includere la dll nel progetto non gestito?
Devi collegare al file .lib che viene generato durante la compilazione del codice C # ( https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396 )
Credo che tu stia cercando Reverse PInvoke. Se cerchi Google Pinvoke inverso riceverai molte voci utili. Penso che quanto segue abbia un buon esempio veloce e sporco.
Il tuo codice chiamante è C ++ con / clr abilitato. Destra?
Se sì, allora puoi semplicemente usare l'istruzione using per usare la tua dll .NET nel tuo codice. Qualcosa del tipo:
#using <Mydll.dll>
e quindi puoi semplicemente creare gli oggetti delle tue classi gestite come:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
Se vuoi rendere questo obj un membro di dati della tua classe, usare gcroot è la strada da percorrere.