Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Delegates Y Llamadas A Dll Desde C#

Iniciado por Haddd, 18 de Marzo de 2005, 04:39:42 PM

« anterior - próximo »

Haddd

 Estoy itnetnando hacer un Wrapper de Newton. Por ahora, bien, pero al utilizar callbacks....

   public class NewtonWrapper
   {
       public delegate void SetTransformCB(int body, ref Matrix matrix);

       [DllImport("Newton.Dll")]
       public static extern void NewtonBodySetTransformCallback(int bodyPtr, SetTransformCB cb);
   }

Entonces en el código, hago:

           NewtonWrapper.SetTransformCB cb = new NewtonWrapper.SetTransformCB(PhysicsSetTransform);

                       NewtonWrapper.NewtonBodySetTransformCallback(boxBody,cb);


El problema está en que el metodo UpdateWorld de Newton me da un error de memoria corrupta.
Creo que es debido a que el delegado se libera por el garbage collector. ¿Cómo puedo evitar que eso ocurra ?


Muchas gracias.  (ole)  

zupervaca

 yo de c# cero patatero, lo unico que puedo decirte es que mires si antes de nada esa dll requiere algun tipo de inicializacion llamando a funciones, etc

Haddd

 Ya está resuelto. Resulta que en net 2.0 hay una forma de resolverlo  :D  

ethernet

 arg! pero pon la solución por si alguien tiene el mismo problema, nos dejas con la miel en los labios xDDD

Haddd

 Ahí va. Pero sólo funciona con 2.0

   [UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.Cdecl)]
   public delegate void SetTransformCB(int body, ref Matrix matrix);

Como el callback se llama en la dll utilizando cdecl ( por defecto .net asume stdcall), y en 1.0 no hay forma de especificarlo, para la 2.0 han creado este "atributo".  

zupervaca

 
CitarComo el callback se llama en la dll utilizando cdecl ( por defecto .net asume stdcall), y en 1.0 no hay forma de especificarlo, para la 2.0 han creado este "atributo".

jurr pues yo sin el __cdecl no puedo vivir (uoh)  






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.