Anteriormente habia creado un embedding para ejecutar un ensamblado Mono desde C y les comente que necesitaba crear una instancia de una clase dentro del universo del Mono y ahora he hecho algo parecido, una llamada externa desde el CLR que se implementa en C. Esta tecnica difiere de el interop usando DllImport el cual consiste en crear el simbolo en C# y vincularlo a una libreria externa sin necesidad de un Host del MonoRuntime, en el caso de las external call el simbolo igualmente se declara en el ensamblado pero el simbolo apunta a la funcion que el Host del MonoRuntime registre.
Por ejemplo:
public class myMonoClass
{
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern static void sayHello();
}
En nuestro Host del MonoRuntime creamos la funcion en C que se ejecutara cuando se invoke al metodo expuesto con el atributo MethodImpl como se muestra a continuacion:
static void sayHello_myCLR ()
{
printf("Saying hello from C using a CLI Internal Call\n");
}
Y por ultimo registramos la llamada externa del CLR con la funcion en C.
mono_add_internal_call("myMonoClass::sayHello",sayHello_myCLR);
Nota:
mono_add_internal_call
debe ser invocado SOLO despues de cargar el ensamblado que tiene el methodo externo.
Pero aunque esto es muy cool, esto no soluciona mi problema, y aun sigo necesitando crear una instancia de una clase en un ensamblado desde C.
[Descargar mono_embedding_ext_call.tar.gz]
No comments:
Post a Comment