2010-03-20 15 views
6

Il mio progetto è stato sviluppato in MFC che non è un codice. Ora ho bisogno di creare un'applicazione simile in C#, riutilizzando la maggior parte delle classi MFC.Utilizzo del codice non gestito dal codice gestito

E 'possibile esportare direttamente class/struct/enum da dll MFC, in modo da poterlo importare nel mio C# usando dllimport e usarlo?

risposta

5

Sì, è abbastanza possibile. Devi solo stare attento con i tipi. Molti traducono molto bene, ma alcuni sono bizzarri.

Il nome del concetto che si sta cercando è interoperabilità COM. Vedi qui per un getting started tutorial. Ovviamente, la DLL MFC deve supportare COM per essere accessibile da .NET. È necessario ricostruire le DLL MFC con le interfacce COM appropriate supportate.

Ecco uno MSDN overview of COM Automation completo di collegamenti a progetti di esempio.

E qui è un simple but to-the-point CodeProject sample che dimostra esattamente come le DLL COM possono essere utilizzate dagli assembly .NET.

Grande pinvoke reference here. Per accedere anche alle API native Win32.

Edit: Un'altra idea

Nel caso in cui non è possibile ricostruire le DLL MFC (non si ha l'origine o la versione corretta del IDE) è possibile creare un COM DLL "wrapper" in MFC o raw C/C++ che importerebbe le DLL MFC nel modo standard, pre-COM e quindi esporre gli oggetti ei metodi necessari.

+0

Grazie mille per le informazioni. Il problema per me è, non sono in grado di aggiungere riferimento alla dll MFC che ho creato come menzionato in "tutorial introduttivo". Dice, la DLL non è un componente COM valido. – Harsha

+0

Ah, ok. In tal caso, è necessario ricostruire le DLL MFC e renderle COM-utilizzabili, se si pensa che questo significhi attivare il flag di automazione per la build (sono passati molti anni dall'MFC per me.) Quando si ricostruiscono le DLL MFC si avrà COM- interfacce accessibili pronte per l'uso in .NET –

+0

@Harsha: ho aggiunto alcune informazioni di automazione COM nel corpo della risposta originale. Dai un'altra occhiata. –

3

Non è possibile [DllImport] classi MFC, funziona solo per funzioni statiche. Trasformarli in coclasse COM è tecnicamente possibile, l'intervento chirurgico è importante. Il modo migliore per farlo è scrivere i wrapper di classe gestiti nel linguaggio C++/CLI. Scriveresti una classe ref per ogni classe MFC. Memorizza un puntatore all'oggetto classe MFC, ogni metodo chiama direttamente il metodo di classe MFC corrispondente. Nella stragrande maggioranza dei casi quella è una riga di codice.

È un processo molto meccanico, è possibile eseguire use SWIG per il lavoro per voi. Non sono sicuro di quanto sia buono, mai usato da solo.

Un tutorial decente su C++/CLI e l'approccio wrapper è available here.

Problemi correlati