Sono davvero confuso dalla moltitudine di informazioni errate sull'interoperabilità nativa/gestita.Chiamata di un callback nativo dal codice gestito .NET (durante il caricamento del codice gestito tramite COM)
Ho un normale exe C++ che NON è compilato utilizzando roba CLR (non è né gestito C++ né C++/CLI e non lo sarà mai). Questo exe C++ è "responsabile", non esiste un wrapper gestito per questo.
Vorrei accedere ad un codice che ho in un assembly C# dal mio exe C++. Posso accedere all'assembly C# dal mio codice C++ usando COM. Tuttavia, quando il mio codice C# rileva un evento mi piacerebbe richiamarlo nel mio codice C++. Il puntatore della funzione C++ da richiamare verrà fornito in fase di runtime. Si noti che il puntatore della funzione C++ si riferisce a una funzione trovata nell'ambiente di esecuzione di exe. Può usare membri statici da lì. Non voglio che il codice gestito provi a caricare qualche DLL per chiamare una funzione (non ci sono DLL).
Come faccio a passare questo puntatore di funzione C++ al mio codice C# tramite COM/.NET e il mio codice C# lo chiama correttamente?
Grazie!
Nel passaggio 2 il puntatore di funzione inizialmente arriverà in C# -land come IntPtr? – evilfred
Per ottenere il puntatore da C/C++ a C#, verrà eseguito il marshalling. Sì, i puntatori C/C++ sono rappresentati come C# 'IntPtr', le cui dimensioni sono specifiche della piattaforma. –
Probabilmente sto facendo qualcosa di stupido. Il compilatore C++ si lamenta di non poter convertire il mio parametro da voic (__ cdecl *) (UINT) a long (il metodo accetta un IntPtr in C#). Inoltre, l'esempio di Zhang riguarda un puntatore di funzione C++ recuperato in C# non recuperato da C++ ... – evilfred