2009-07-01 20 views
15

Da quello che ho capito, posso usare reverse P/Invoke per chiamare C# da C++. Reverse P/Invoke è semplicemente un caso di:Chiamare C# da C++, Reverse P/Invoke, DLL in modalità mista e C++/CLI

  1. Creare la classe gestita (C#).
  2. Creare un progetto libreria di classi C++/cli (precedentemente gestito in C++). Usalo per chiamare la classe C# gestita (presumibilmente tramite un riferimento).
  3. Chiama il codice C++/cli dal C++ nativo.

Domande:

  1. È corretto?
  2. La DLL creata al passaggio 2 è nota come DLL in modalità mista?
  3. C++/CLI ha completamente sostituito il C++ gestito per quanto riguarda MS?
  4. COM viene completamente evitato utilizzando questo approccio?
  5. A che punto verrà creato e gestito il CLR e da chi?

Grazie in anticipo

+1

Quando si esegue questa operazione, è utile trovare la classe template gcroot <>. –

risposta

20

Ecco le risposte al meglio delle mie conoscenze:

  1. Sì, è una DLL modalità mista (In realtà, si può fare uno il file del tuo progetto C++ nativo è gestito e crea questa classe C++/CLI in quel file e chiama il codice direttamente da quel file.Non hai nemmeno bisogno di una DLL separata per farlo.
  2. C++/CLI e Managed C++ rappresentano entrambi stesso t Hing. L'unica differenza è che nella versione precedente fino a Visual Studio 2003 era denominata Managed C++. In seguito, la sintassi è stata modificata parecchio e è stata rinominata in C++/CLI. Date un'occhiata a this link per i dettagli.
  3. CLR verrà utilizzato ogni volta che viene effettuata una chiamata alla DLL gestita.
+1

Potrebbe fare con un pulsante +10 - grazie. – ng5000

+0

È realistico aspettarsi di prendere una libreria C++ Win32 esistente e ricompilare utilizzando C++/CLI? – ng5000

+2

non proprio ... C++/CLI è un linguaggio diverso e C++ con CLR attivato è diverso. Se si desidera eseguire questa operazione con CLR attivato in un progetto Visual C++, è possibile eseguire questa operazione ma potrebbero verificarsi problemi durante la compilazione.Dipenderà dall'implementazione di quella libreria specifica. – Aamir

2

Nota, è anche possibile eseguire un round trip della DLL C# ed esportare metodi statici, che funzionano sostanzialmente come le esportazioni in C++/CLI. Tuttavia, questo è sempre un passaggio post-compilazione, e ha some caveats (che anche l'esportazione in C++/CLI ha, btw.).

È possibile utilizzare ILDASM sia le DLL C# che le DLL C++/CLI per vedere come vengono esportate le donazioni; si tratta di qualcosa di simile (da a sample on the net):

// unmexports.il 
// Compile with : ilasm unmexports.il /dll 
assembly extern mscorlib {} 
..assembly UnmExports {} 
..module UnmExports.dll 
// This flag is important 
..corflags 0x00000002 
// This instructs the CLR to create a marshaling thunk for the unmanaged caller 
..vtfixup [1] int32 fromunmanaged at VT_01 
..data VT_01 = int32(0) 
..method public static void foo() 
{ 
..vtentry 1:1 
..export [1] as foo 
ldstr "Hello from managed world" 
call void [mscorlib]System.Console::WriteLine(string) 
ret 
} 
1

Con ilasm 2.0 è bisogno di meno codice, perché può generare la maggior parte del gunk da solo. Solo la direttiva .export è davvero necessaria ora.

// unmexports.il 
// Compile with : ilasm unmexports.il /dll 
.assembly extern mscorlib { auto } 
.assembly UnmExports {} 
.module UnmExports.dll 
.method public static void foo() 
{ 
    .export [1] as foo 
    ldstr "Hello from managed world" 
    call void [mscorlib]System.Console::WriteLine(string) 
    ret 
} 
Problemi correlati