Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Port A C#...

Iniciado por TheAzazel, 17 de Octubre de 2005, 11:54:45 AM

« anterior - próximo »

vincent

 
CitarMuchas gracias Vicent! el problema de eso es que solo funciona con C.. en cuanto te pones con clases y demas... ya no tira
en el ejemplo que te he puesto antes, el objeto  pClient[IdClient] es un objeto de una clase llamada CRender... así que en principio si que va con C++ y clases...

Suerte!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Haddd

 bueno, si es o no lento, realmente no lo noto, porque las llamadas a Newton que se hacen son muy opequeñas. Luego Newton ya se encarga por detrás de todos los temas...

Vicente

 Hola,

he mirado lo de Qt#, y lo que hacen ellos es generar un wrapper de QtC que es a su vez un port de Qt a C... Así que por ese camino nada, sorry :( Un saludo,

Vicente

Gezequiel

 TheAzazel, estube viendo un poco la lib para en un corto tiempo poder empezar con el port haber que tal me va...

El problema seria que habria de portar???

Solo CRM32Pro.dll???

O alguna otra cosa mas???

Voy a tratar de hacer el port en C# directamente y si no se puede luego vemos que pasa...

Adios!!

P.D: Estube viendo un poco el ejemplo de Haddd y segun entendi ademas de portar CRM32Pro.dll habria que portar cada funcion de este y establecer si es bool, int, o lo que sea... Hasta ahora ese seria el maximo problema...

Gezequiel

 Bueno, no pude esperar y me meti a tratar de hacer algo, lastima que llegue tarde para editar  (nooo) .
Para que el trabajo sea sencillo ya que no me conosco la libreria de punta a punta seria bastante agradable conocer cada funcion, que parametro recibe y que devuelve... Claro que de esa forma el trabajo ya estaria muy sencillo, seria solo cuestion de ponerse y portar cada funcion como hizo Haddd es su ejemplo...

Ahora la pregunta
Tienes algun texto donde se expliquen las funciones???
Ahi alguna forma de que pueda verlas???

Supuse que si me conseguia algo tipo Visual Studio seria cuestion de referenciar la libreria estando en un projecto C++ y revisarla... Eh aqui el problema, yo no uso Visual Studio, uso SharpDevelop que es free (Di "no" a la pirateria :P )... Aunque ahora voy a ponerme a revisar si puedo hacer que lea la lib... (espero que si (uoh) )

Edito: Ya eh tratado de ver la librewria desde SharpDevelop y cuando la referencio en un projecto C++.Net y trato de abrirla pone algo como esto:
Citar"No se puede cargar el archivo CRM32Pro.dll en la ubicación C:\Archivos de programa\CRM32Pro. revise los permisos y la existencia de ese archivo."
Y si pido que muestre la excepcion pone:
CitarSystem.OutOfMemoryException: Se inicio una excepcion de tipo System.OutOfMemoryException.
Y ahora que lo leo es lo mismo que pone al intentar reerenciar la lib desde C#

Haber si alguien me da una mano, que para alguien que hace unos meses empezo con C# es dificil... :rolleyes:

P.D: Espero no haberlos aburrido con mis quisas sencillas preguntas... Adios!

TheAzazel

 Creo que eso es porque estas intentado cargar un dll en C++ unmanaged... ya te comente en otro thread que primero hay que hacer un wrapper de las funciones que encontraras en CRM32Pro.h en C++ managed y luego ya...esa dll la puedes usar en cualquier .NET.

saludos y mucho animo!! al fin alguien se anima echando un cable :P (ojo, sin contar a todos los del logo que los debo una jeje)

Gezequiel

 Entonces tendria que hacerse todo en Managed C++???
Y porque no en C#???
Marca algun error o algo???

La cuestion es que no tengo ni una minima nocion de C++!
Eso seria un problema??

P.D: Me encontre esto por Internet, haber si sirve de algo...
http://blogs.msdn.com/deeptanshuv/archive/.../26/432870.aspx

zupervaca

 TheAzazel si quieres hacer un port a c# u otro lenguaje te aconsejo que crees una dll en c que encapsule todas las clases de c++ que tienes, una funcion que haga el new de la clase, otra que llame a una funcion de la clase indicandole un puntero devuelto por la primera funcion que te dije, etc piense que si estuviera hecho en c a las funciones tendrias que pasarles el puntero a la estructura con lo que seria lo mismo, si no me explico bien dimelo y vuelvo a intentarlo, el unico problema que puedes tener es si el programador tuviera que derivar alguna clase, este sistema es un poco absurdo ya que llamas a una funcion para que esta llame a otra, pero es lo unico que se me ocurre si quieres salir del paso y no tener que modificar toda la libreria que tienes ahora

TheAzazel

 Encapsular la dll en otra escrita en c es bastante costoso y encima, a la hora de usar la lib desde C#(por ejemplo) las funciones serian distintas...donde en C++ seria un CTile *tile=new CTile pasaria a ser otra cosa y eso no me atrae....

La clave de todo la encontre y lo postee en un post anterior en este mismo thread....

http://msdn.microsoft.com/library/default....arp12192002.asp

hay explica como hacer un wrapper de una DLL codificada en C++ unmanaged con C++ managed y luego ya, esa nueva DLL que haria de wrapper puede ser utilizada directamente desde cualquier lenguaje .NET.

Gezequiel, mira ese ejemplo y veras que entre C++ managed y C# hay muy muy pocas diferencias a nivel de sintaxis(de hecho, es la misma y no se si habra algun cambio) lo unico es a la hora de definir las clases y definir lo que vas a utilizar..pero en ese documento te lo explica muy bien y en base a el, puedes intentar hacer un wrapper de la interfaz mas sencilla...que seria ILogSystem (al menos con el miembro Init) y cuando consigas que el Init funcione pues puedes ir avanzando... y cuenta conmigo que una mano te podre echar :)

dime que te parece ese doc

Gezequiel

 Mmm... Parece un link bastante interesante...
Voy a ver si luego le pego una leida y te digo que tal esta la cosa, teniendo en cuenta que no tengo el mejor ingles del mundo (algo es algo :rolleyes: ).

Ahora lo reviso y me pongo a ver que sale...

TheAzazel

 Ok, visitare el foro luego mas tarde a ver como va el tema :)

Gezequiel

 Bueno, en un intento rapido, revisando la ayuda de la libreria y el link que dejaste hice algo muy basico, que probablemente este mal, pero quisas asi ustedes (los que saben y sobretodo TheAzazel, que conoce la libreria) pueden ver donde estan los problemas, y quisas asi me empieze a orientarme mas y despues de arreglar varios errores pueda largarme solo... En definitiva, quedo algo asi:

Citar
#include "CRM32Pro.h"

using namespace System;

public __gc class ILogSystem
{

public:
   Uint8 CRM32Pro_ILogSystem::GetState ( void )
 
}


Tengan es cuenta que eso esta incompleto y que no se C++ (apenas se C#), pero veamos que sale...

Gezequiel

 Esperando sus respuestas me eh encontrado con mas informacion (en ingles por supuesto) sobre wrappers y esas cosas (segun entendi puede hacerse directamente en C#, algo que me quitaria varios quebraderos de cabeza)

Lo dejo sobretodo para alguien que quiera un poco mas de info sobre como se hacen estas cosas...

How can you migrate your existing application?

Bueno, espero que les sirva de algo...

Adios!

Gezequiel

 Siguiendo con mis intentos, esta vez en C#, y siguiendo la idea del link que deje anteriormente, seria algo por el estilo:

Citar
using System;
using System.Runtime.InteropServices;

public class CRM32ProWrapper
   
{
[DllImport("CRM32Pro.dll", EntryPoint = "CRM32Pro_ILogSystem")]
public static extern void ILogSystem(int a, int B);
}

/* El void y los int a y int b los puse porque no sabia que poner,
* pero ahi tendria que ver que dice TheAzazel, respecto de los
* datos de ILogSystem, pero mientras puse esos ;).
* (Veamos que opina Haddd que es el que sabe de estas cosas de C#...) */

El problema es que de ahi en adelante no se como llamar las funciones de ILogSystem que serian segun lo que entendi:
Citar

Public Member Functions

void  Init (char *filename, char mode, char level, char *prgname, char                         
         *author=NULL, char *email=NULL, char *web=NULL)
         Init LogSystem.

void  Msg (char level, char *,...)
         Output a log message.

void  DumpSurface (SDL_Surface *surface)
         Print surface information.

Uint8 GetState (void)
         Get log system state.

void  ProfileBegin (char *name)
         Mark the begin of profile block.

void  ProfileEnd (char *name)
        Mark the end of profile block.

void  ProfileShow (void)
         Print to log system the samples results table.


O se podrian llamar directamente ya que lo otro esta Wrappeado??
(Haddd, tu que tienes experiencia, me guias un poco??)

Haber quien me echa un cable! (ole)  :rolleyes:  ;)

BeRSeRKeR

 Hola.

Me he tomado un descanso en el tema de los tutoriales de Haddd y he creado en un momentillo un wrapper en managed C++ para CRM32Pro versión 4.62. Bueno, evidentemente no es un wrapper completo. Sólo he implementado la clase ILogSystem y lo he probado en un cliente en C# y funciona perfectamente. El único impedimento que he encontrado ha sido a la hora de implementar los argumentos de número variable. En unmanaged C++ sería:

void Msg(char level, char *msg, ...)

en managed C++ sólo he visto esta forma:

void Msg(char level, String *msg, Object* arg __gc[])

Con lo cual luego en C# se utilizaría de la siguiente forma:

object[] vargs = new object[] { "Arg0", "Arg1" };
log.Msg(ILogSystem_Level.Normal, "\nTesting Variable Arguments: {0} {1}", vargs);


Pero claro, no mola. Lo ideal sería poder utilizar:

log.Msg(ILogSystem_Level.Normal, "\nTesting Variable Arguments: {0} {1}", "Arg0", "Arg1");

Pero por lo que he leído, para tener ese tipo de argumentos múltiples hay que modificar el MSIL y bueno, no me he molestado en mirar más en profundidad cómo se haría. :)

En el archivo descargable va el proyecto (VC++ .NET 2003) que envuelve la dll y también un proyecto en C# (VC# Express 2005 Beta2) que sirve para probar el wrapper. También va la distribución de CRM32Pro 4.62 (Win32) que hay en la web de TheAzazel pero he quitado las dll del directorio "Microsoft DLL" porque si no ocupaba bastante más. :)

Descargar.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.