2010-03-20 10 views
6

Tengo mi proyecto desarrollado en MFC, que es código sin procesar. Ahora necesito crear una aplicación similar en C#, reutilizando la mayoría de las clases de MFC.Uso del código no administrado del código administrado

¿Es posible exportar directamente class/struct/enum desde MFC dll, para poder importarlo en mi C# utilizando dllimport y usarlo?

Respuesta

5

Sí, es muy posible. Solo debes tener cuidado con los tipos. Muchos se traducen muy bien, pero algunos son extravagantes.

El nombre del concepto que está buscando es COM interopera. Consulte aquí para obtener un getting started tutorial. Por supuesto, el archivo DLL de MFC debe admitir que COM sea accesible desde .NET. Debe volver a generar las DLL de MFC con las interfaces COM adecuadas admitidas.

Aquí hay un MSDN overview of COM Automation completo con enlaces a ejemplos de proyectos.

Y aquí hay un simple but to-the-point CodeProject sample que muestra exactamente cómo se pueden usar las DLL COM desde los ensamblados .NET.

Excelente pinvoke reference here. Para acceder a las API nativas de Win32 también.

Editar: Otra idea

En caso de no poder volver a crear las DLL de MFC (que no tiene la fuente o la versión correcta del IDE) puede crear un COM DLL "contenedor" en MFC o C/C++ sin formato que importaría las DLL de MFC de manera estándar, antes de COM y luego expondrá los objetos y métodos que necesita.

+0

Muchas gracias por la información. El problema para mí es que no puedo agregar una referencia al dll de MFC que creé como se menciona en "Cómo empezar tutorial". Dice que el dll no es un componente COM válido. – Harsha

+0

Ah, está bien. En ese caso, debe reconstruir los archivos DLL de MFC y hacerlos utilizables por COM, si esto significa que debe activar el indicador de Automatización para la compilación (han pasado muchos años desde que MFC para mí). Cuando reconstruya sus archivos DLL de MFC, tendrá COM- interfaces accesibles listas para usar en .NET –

+0

@Harsha: agregué algunas informaciones de COM Automation en el cuerpo de la respuesta original. Eche otro vistazo. –

3

No puede [DllImport] Clases de MFC, solo funciona para funciones estáticas. Convertirlos en coclasses COM solo es técnicamente posible, la cirugía es importante. La mejor manera de hacerlo es escribiendo envoltorios de clase administrados en el lenguaje C++/CLI. Usted escribiría una clase de referencia para cada clase de MFC. Almacena un puntero al objeto de clase MFC, cada método llama directamente al método de clase MFC correspondiente. En la gran mayoría de los casos, esa es una línea de código.

Es un proceso muy mecánico, puede use SWIG hacer el trabajo por usted. No estoy seguro de lo bueno que es, nunca lo usé yo mismo.

Un tutorial decente en C++/CLI y el enfoque de envoltura es available here.

Cuestiones relacionadas