VC++ desde C#

07/05/2008 - 17:48 por Jose M.Bonet | Informe spam
Os expongo el tema para ver si alguien me puede asesorar.

Necesito realizar una serie de componentes graficos. Mi intencion inicial es
la de encapsular los componentes/clases dentro de una libreria VC++ y luego
utilizarlos desde el programa principal hecho en C#.

Pero no tengo ni idea de por donde cogerlo y si esta es una buena opcion o
no. A ver si alguien me puede aconsejar y si me pasais algun enlace con
ejemplos pues ya seria genial.

PD. No quiero utilizar los usercontrols pues los veo demasiado lentos.

Preguntas similare

Leer las respuestas

#1 RFOG
07/05/2008 - 19:38 | Informe spam
Hola.

El tema no es sencillo, y casi es un mundo por sí mismo. La idea que tienes
es perfecta: un módulo en C++ optimizado al máximo que es ejecutado desde
C#.

Tienes dos opciones posibles:

La primera y menos óptima es usar el Interop por atributos del C#
directamente sobre el módulo de C++, que típicamente es una DLL con
exportaciones de funciones estilo C, no C++. Es equivalente a lo que se hace
cuando se llama a las propias funciones nativas de Win32, pero con tu DLL.

La segunda y más optima es utlizar un ensamblado en C++/CLI que envuelva a
la DLL en C, y luego tu llamas a ese ensamblado desde C#. El interop IJT de
C++/CLI es mucho más rápido que el de C#, pero tienes la contrapartida de
que has de hacer una nueva DLL en C++/CLI, de forma que dentrías por un lado
tu aplicación, y luego una DLL .NET que a su vez usaría la DLL nativa.

Una tercera opción es compilar el código fuente de C++ nativo con la opción
/clr, o al menos las funciones envolventes, y crear de nuevo un envoltorio
en C++/CLI que sería usado directamente por C#. Aquí la ventaja está en que
sólo tendrías un ensamblado extra, la DLL de C++/CLI, y el rendimiento sería
un poco, pero solo un poco menor.

Ejemplos de todo esto, o al menos ejemplos completos, no hay nada que yo
sepa. Alguna entrada de mi blog de Geeks (mira en mi firma) trata el tema
del Interop IJT de pasada, pero todavía no he escrito nada serio sobre el
tema.

Un punto de entrada para la documentación podría ser este:
http://msdn.microsoft.com/es-es/library/sd10k43k(en-us,VS.80).aspx, aunque
la MSDN no es muy clara al respecto, o al menos yo no he encontrado nada que
clarifique el tema.

Lo que puedes hacer es liarte la manta a la cabeza, elegir uno de los tres
modelos que te he expuesto y conforme te vayan surgiendo cosas las pones en
el grupo de C++ (microsoft.public.es.vc) las que sean de C++ ó C++/CLI y las
demás aquí.

"Jose M.Bonet" escribió en el mensaje de noticias
news:
Mostrar la cita
Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Cosas mías: http://rfog.blogsome.com/
Libros, ciencia ficción y programación
La moda es la pugna entre el instinto natural de vestirse y el instinto
natural de desnudarse.
#2 Eugenio Serrano
08/05/2008 - 04:59 | Informe spam
Que tanta velocidad necesitas?

Yo me he hecho un control con solapitas, donde dibujo linea por linea, y
manejo, textos, etc todo usando el namespace System.Drawing y la verdad que
me sorprendio lo rapido que anda...

Pero claro, eso comparado con un juego o cosas asi, es minimo.


Saludos,
Eugenio Serrano
MVP ASP.Net
Solid Quality Mentors


"Jose M.Bonet" wrote in message
news:
Mostrar la cita
#3 Jose M.Bonet
08/05/2008 - 08:39 | Informe spam
Gracias RFOG, creo que me quedo con la segunda opcion ya que me parece la
mas correcta y profesional.

No importa que exista una dll mas, como comente esto va ha ir en un sistema
embedded por lo que lo instalare yo equipo por equipo y practicamente no
deberian haber actualizaciones.

Entonces a ver si lo he entendido bien.

1.- Se debe crear el control con C++ no manejado y encapsularlo en una DLL
2.- Se debe crear una DLL con C++/CLI (que si no me equivoco esto es C++
manejado) que para lo unico que sirve es de Interface entre el C# y el C++
no manejado.ya que C# no puede gestionar codigo no manejado.
3.- Y finalmente el aplicativo en C# que llamara a la DLL C++/CLI.

Por favor corrijeme si me he equivocado. Y gracias.


"RFOG" escribió en el mensaje
news:
Mostrar la cita
#4 Jose M.Bonet
08/05/2008 - 08:52 | Informe spam
No es que la velocidad sea muy critica. El problema principal radica es que
el programa va a correr en un sistema embedded con no muchos recursos y mi
intencion es eliminar el molesto y poco estetico parpadeo a la hora de
repintar los controles.

Recuerdo que en mi epoca dorada de C para evitar estas cosas se dibujaba en
una segunda pagina en memoria (no visual) y una vez terminado el dibujo
directamente se volcava a la memoria grafica. Pero todo esto lo hacia a
traves de interrupciones y accesos a la memoria de video y ram, cosa que no
se si ahora se puede hacer ya que abandone C cuando aparecio Delphi (contra
mi voluntad) y practicamente no lo he vuelto a tocar hasta ahora.

PD. Perdona Eugenio, te he enviado este post a tu mail por error.


"Eugenio Serrano" escribió en el mensaje
news:
Mostrar la cita
#5 RFOG
08/05/2008 - 09:22 | Informe spam
Hola.

Pero si lo que quieres es evitar el "flickering" no hace falta que te salgas
del .NET. Puedes activar el doble buffer de la mayoría de los controles de
forma "legal" o "ilegal".

Echale un vistazo a esta entrada:

http://geeks.ms/blogs/rfog/archive/...panel.aspx




"Jose M.Bonet" escribió en el mensaje de noticias
news:
Mostrar la cita
Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Cosas mías: http://rfog.blogsome.com/
Libros, ciencia ficción y programación
Durante la juventud creemos amar; pero sólo cuando hemos envejecido en
compañía de otro, conocemos la fuerza del amor.
Ads by Google
Search Busqueda sugerida