2010-10-25 14 views
11

Finora ho capito che era necessario ricompilare la libreria come .dll anziché .lib, abilitare /clr e /EHa anziché /EHsc. Ora ho una DLL gestita che ho aggiunto come riferimento nel mio progetto C#.Come utilizzare una libreria C++ in un'app C#?

Ora come si usa?

Sono pronto a scrivere alcuni wrapper, ma non so da dove cominciare o come "vedere" a quali funzioni ho avuto accesso. Ho letto un po 'su come i nomi delle classi e le funzioni potrebbero essere storpiati dal compilatore ... devo tornare indietro e aggiungere esportazioni __declspec ovunque (se sì, come?), O c'è un'opzione in VS2010 che dice "non mangiarlo!"?

La libreria C++ in questione è ancora in fase di sviluppo attivo, quindi spero di poter modificare la libreria C++ il meno possibile e ricompilarla periodicamente con alcuni switch, quindi esporre la nuova funzionalità come ne ho bisogno .

risposta

8

Se state per compilare il vostro C++ (se originariamente era C++ non gestito) dovrete fare molto di più che aggiungere semplicemente l'opzione/clr. Affinché C# usi la DLL dovrai creare classi gestite e altri tipi basati su CTS compatibili con C# (.NET).

See e classi ref.

Un buon libro da leggere su questo argomento (IMHO) è presente one

+0

Quindi ... per creare le classi gestite, devo farlo in C++/CLI, o cosa? Ho bisogno di un altro po 'per andare avanti. – mpen

+0

sì avete bisogno di più per andare avanti, vorrei suggerire di verificare i collegamenti. Ci sono anche alcuni strumenti per convertire C++ in C++ gestito da Microsoft, questo può essere d'aiuto. Dai un'occhiata a questo: http://stackoverflow.com/questions/151776/are-there-any-tools-for-converting-managed-c-to-c-cli –

6

Si può o esporre le funzioni come funzioni stile C (vale a dire, senza mangling) dalla DLL oppure è possibile esporre come oggetti COM.

+0

Come li uso come oggetti COM? – mpen

4

Suggerirei di scrivere un wrapper COM e utilizzarlo. Dai un'occhiata a http://msdn.microsoft.com/en-us/library/035x3kbh%28v=VS.80%29.aspx per le istruzioni di introduzione. Ti consigliamo di rendere le interfacce dell'oggetto derivate da IDispatch e di essere compatibili con l'automazione, il che dovrebbe consentire al runtime di consumarle senza alcun marshalling personalizzato.

Un buon vantaggio di questo approccio è che è possibile continuare a creare il codice nativo come libreria e utilizzare solo il progetto COM. Inoltre, è ancora codice nativo all'interno dell'oggetto COM, quindi c'è molto meno potenziale per i problemi sconosciuti (una volta che il livello dell'interfaccia funziona).

Questo è il mio suggerimento, comunque.

2

Sì, racchiuderlo in un oggetto COM. Credo che ATL sia ciò che fai per farlo con il minimo sforzo.

+0

ATL? Stai parlando con qualcuno che non l'ha mai fatto prima. – mpen

+0

Libreria modelli ActiveX. Fa parte dell'ambiente di sviluppo MS e viene utilizzato per creare oggetti COM in C++. –