2009-12-31 7 views
5

Así que estoy diseñando una aplicación que necesariamente trabaja en C++, pero MFC/ATL es demasiado desordenada para mi gusto, así que tuve la brillante idea de hacer todo el código de "pensamiento" en C++ nativo y todo el bonito código de UI en C#. El problema, sin embargo, es la interoperabilidad entre los dos. Antes de dejarme llevar por esto, me preguntaba si este es un problema resuelto, y hay una forma realmente buena de hacerlo. Tenga en cuenta que no quiero mezclar lógica y mostrar en el mismo módulo, ya que da lugar a un acoplamiento molesto.Interoperativo nativo de C++ y C#

Esto es lo que tengo hasta ahora:

enter image description here

Dime, ¿Se puede hacer mejor?

+0

¿Por qué necesita ser C++? – SLaks

+1

Porque hay una base de código existente que expone una API de C++, y es mi lingua franca. Estaría perdido sin mis punteros. –

Respuesta

11

La manera más fácil de manejar esto es usar C++/CLI, y exponer su lógica como tipos de .NET.

Es muy fácil envolver una clase nativa de C++ en un ref class que se puede usar directamente desde una interfaz de usuario C#.

Dicho esto: este era mi plan, originalmente, en mi proyecto actual. Mi idea era que necesitaría el código nativo para algunos de los trabajos pesados ​​de matemáticas que solemos hacer. Sin embargo, he descubierto que ha sido más fácil, más rápido y más agradable mover la mayor parte de mi lógica directamente a C# (separada del código de UI, pero todavía en un ensamblado C#) en lugar de intentar implementarlo en C++.

Mi experiencia ha sido que la velocidad no ha sido un problema: el código C# casi siempre ha sido tan rápido o más rápido que el equivalente C++ cuando está sintonizado, y es más fácil perfilar y sintonizar el código C#.

+0

¿El código de contenedor que coloqué en Proxy.dll es más o menos la misma estrategia? ¿Puedo tomar esto como un "me parece bien"? –

+0

En cuanto a la parte de la interfaz .NET/C++ de su diagrama, sí, se ve bien. He hecho este mismo tipo de cosas con una base de código C++ existente donde quería hacer la GUI en C#. – AaronLS

+0

Yo también reescribí el código C en C# y estoy muy satisfecho con el rendimiento que he visto. Tendría que ser una aplicación muy intensiva en el procesador para no notarlo. –

1

Puede que tenga una buena razón para que su núcleo sea una DLL. Pero no es necesario. Tuve éxito con una aplicación que es C++, crea un App Domain y carga un ensamblaje en él, luego crea una instancia de un objeto en el dominio de la aplicación y lo llama, pasándole una interfaz a la aplicación. Esto es básicamente lo que hace el C-runtime cuando creas una aplicación no administrada de todos modos.

La interfaz que expone el código C++ al código C# se define en C#. Creo que esto es más fácil que definir las intefaces en COM puro. La interoperabilidad de C# le da más control de la clasificación que C++.

  • crear un archivo app_interface.cs que define la interfaz
  • compilar app_interface.cs en una DLL, que no se preocupan por la DLL. necesitamos la biblioteca de tipos
  • en el código C++ #import <app_interface.tlb> raw_interfaces_only esto resulta la biblioteca de tipos en un archivo .h de C++ con las definiciones de interfaz: app_interface.tlh
  • implementan las interfaces

Se puede espolvorear sus app_interface.cs con atributos que controlan el cálculo de referencias como este

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("ffffffff-ffff-ffff-ffff-ffffffffffff")] // guid changed from what I really use 
public interface IMyHostApplication 
{ 
    ... 

    void AddErrorDetails (
     [MarshalAs(UnmanagedType.Error)] uint hr, 
     [MarshalAs(UnmanagedType.LPWStr)] string szErrDetails); 

    ... 
} 
+0

Me gustaría separar el código C++ del código C# tanto como sea posible, manteniendo el área superficial al mínimo. Además, no quiero pensar en el código administrado mientras lo hago nativo. –

+0

El punto principal es que, al comenzar desde cero, es más fácil definir la interfaz entre las dos partes en C# desde el principio. #import garantiza que lo que C++ y C# ven como la definición de la interfaz provienen de un único archivo. –

+0

No importa cómo lo haga, definitivamente debe intentar minimizar el área de superficie de la interfaz entre C++ y C# –

Cuestiones relacionadas