2012-04-04 15 views
5

Tenemos un gran proyecto escrito principalmente en C# (servicios, multihilo, etc.). Sin embargo, los algoritmos de crujido de números centrales están escritos en C++ no administrado para ser rápidos (OpenMP, etc.).Usar las propiedades de C# en el código de C++ no administrado

Desafortunadamente, por el momento tenemos que esforzarnos mucho para intercambiar datos entre estos dos mundos. Es decir, tenemos que escribir clases de ajuste en C++/CLI para cada una de las clases de C++. Para (virtualmente) cualquier ajuste requerido (Propiedades) en C# - "mundo" hay una copia en el mundo de C++ (un archivo de encabezado) y una conversión explícita de ida y vuelta en la clase contenedora. Esta arquitectura parece muy ineficiente y bastante propensa a errores.

Pregunta principal: ¿Hay alguna manera de compartir una clase C# con propiedades de alguna manera automáticamente en C++ no administrado? (tenemos que leer y escribir!)

Pregunta secundaria: ¿Podría darnos algún consejo sobre cómo mejorar la arquitectura en un caso como el descrito anteriormente? Una consideración nuestra fue cambiar completamente a C++, pero tener que encontrar las bibliotecas apropiadas y escribir código limpio para todas las cosas (del sistema) que hacemos en .NET en este momento no nos hace sentir bien.

Muchas gracias por su ayuda y saludos, Jakob

+0

¿Has verificado que escribir los algoritmos en C# es un cuello de botella? C# 4.0 tiene un buen soporte para el desarrollo paralelo ahora. – Nick

+0

No, aún no lo hemos hecho, y tiene razón: debemos intentarlo para estar seguros de este punto. Pero a medida que dependemos de propiedades particulares del almacenamiento en memoria caché y similares, realmente dudo que el algoritmo se ejecute con una velocidad similar en el CLR. –

+2

¿Qué le parece [Protocol Buffers] (http://code.google.com/p/protobuf/)? Existe la posibilidad de usarlo junto con C# utilizando [protobuf-net] (http://code.google.com/p/protobuf-net/). – megabyte1024

Respuesta

1

estoy tratando con problemas similares en mi trabajo donde mi principal tarea es escribir puertos gestionados a cierta alta perfromance, DLL de baja latencia, se trata de casos sencillos donde tengo que ajustar las clases nativas usando C++/cli simple que contiene un puntero sin formato a la clase nativa o problemas más complejos donde el código nativo es un editor del lado del servidor y el código administrado tiene que suscribirse a él utilizando delegados, es decir, tienen que ser convertido a devoluciones de llamada nativas .NET bajo el capó es un servidor COM sofisticado hasta donde yo sé. Es posible escribir ensamblados .NET con el atributo ComVisible establecido en verdadero, entonces actúa como un componente COM clásico y luego es posible usarlo desde el código nativo de C++ como un componente COM. El reverso de usar código nativo de administrado se puede lograr usando los atributos DllImport y todo el Marshaling se puede ajustar con los diversos atributos como StructLayoutAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx) y MarshalAsAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx) También estoy usando la palabra clave insegura. también. Tengo que lidiar con código de alto rendimiento, así que en algunos casos es que después de la creación de perfiles sé cuál es la mejor solución. Si se trata de la solución de clase warpper que ha mencionado o la clásica forma COM, o algún tipo de híbrido con algunos almacenamiento en caché, agrupación de objetos, etc.

Espero que ayude. :)

Disculpas si eso se ve un poco desorganizado. Es muy tarde aquí. :)

+0

Gracias por su respuesta: ya limpié un montón de nuestro código contenedor utilizando Marhsal.StructToPtr y sus compañeros, y espero llegar más lejos utilizando los componentes C++/CLI en los mundos C++ y C++ nativos ... –

+0

Gracias Jakob S. – ervinbosenbacher

Cuestiones relacionadas