Probabilmente il modo migliore per andare qui è l'uso P/Invoke o Platform Invoke. A seconda della struttura o dell'interfaccia di C++ dll, potresti volerli racchiudere in una pura interfaccia C; è più semplice se l'interfaccia utilizza solo i tipi blittable. Se si limita l'interfaccia dll a tipi blittabili (Int32, Single, Boolean, Int32 [], Single [], Double [] - Nozioni di base) non è necessario eseguire alcun marshalling complesso di dati tra gestito (C#) e spazi di memoria non gestiti (C).
Ad esempio, nel codice C# si definiscono le chiamate disponibili nella dll C/C++ utilizzando l'attributo DllImport.
[DllImport, "ExactDllName.dll"]
static extern boolean OneOfMyCoolCRoutines([In] Double[] x, [In] Double[] y, [Out] Double result)
Il piccolo [In] 's e [Out]' s non sono strettamente necessari, ma possono accelerare le cose insieme. Ora avendo aggiunto il tuo "ExactDllName.dll" come riferimento al tuo progetto C#, puoi chiamare la tua funzione C/C++ dal tuo codice C#.
fixed(Double *x = &x[0], *y = &y[0])
{
Boolean returnValue = OneOfMyCoolCRoutines(x, y, r);
}
Nota che sto passando essenzialmente puntatori avanti e indietro tra il mio DLL e codice C#. Ciò può causare errori di memoria perché le posizioni di tali array possono essere modificate dal garbage collector CLR, ma la dll C/C++ non ne sa nulla. Quindi, per evitare questo, ho semplicemente corretto quei puntatori nel mio C#, e ora non si sposteranno in memoria mentre la mia dll sta operando su quegli array. Questo è ora un codice non sicuro e dovrò compilare il mio codice C# con quel flag.
Ci sono molti dettagli sull'interop della lingua, ma questo dovrebbe farti rotolare. Attaccare a un'interfaccia C stateless di tipi blittable è una grande politica, se possibile. Ciò manterrà il codice di interoperabilità della lingua più pulito.
Buona fortuna,
Paul
Avete considerato l'aggiunta di un'interfaccia COM? Poiché, IMHO, passare argomenti e dati di programma con contenitori COM può essere una soluzione. –