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)