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:
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.






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.
Respuesta Responder a este mensaje
#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:
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.



Respuesta Responder a este mensaje
#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:
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:
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.






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.

Respuesta Responder a este mensaje
#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:
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:
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.






Respuesta Responder a este mensaje
#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:
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:
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:
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.













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.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida