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!

È stato utile?

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 )

Dai un'occhiata al GCHandle class e la parola chiave gcroot, che fornisce un wrapper tipesafe, basato su modelli, attorno a GCHandle.

Puoi usarli per contenere un riferimento a un oggetto CLR (o un valore inscatolato) nel codice nativo.

MSDN ha un tutorial di base qui .

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.

PInvoke -Inverso PInvoke e __stdcall - __cdecl

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top