lunes, noviembre 07, 2011

VFP: Como crear un dll en .NET y usarlo desde VFP


Alguien una vez dijo que no es cuestion de cambiarse de un lenguaje a otro sino de usar la herramienta adecuada al problema que se desea resolver. C# es excelente para muchas cosas en las que VFP no es tan bueno, por lo que el poder crear un DLL en C# y usarlo en VFP se convierte en algo muy poderoso.

Aqui les dejo todo un conjunto de tips para lograr justamente esto:

1. En tu clase C# debes incluir el namespace System.Runtime.InteropServices;

2. La clase que deseas accesar desde VFP debe estar declarada como public y tener estas directivas:

[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("className")]

donde "className" es el nombre OLE de la clase, es decir, el que usaras en el CREATEOBJECT en VFP.

3 Los metodos de la clase que quieras accesar desde VFP deben estar declarados como public y no ser estaticos.

4. Los metodos publicos de la clase no pueden tener sobrecargas, es decir, multiples versiones del mismo metodo con diferentes parametros.

5. Si un metodo devuelve un tipo estructurado, este tipo debe ser creado como class (no como struct) y cumplir con todas las condiciones indicadas en los puntos 1, 2, 3 y 4.

6. Si un metodo devuelve un array de cualquier tipo (ej, string[]), VFP lo recibe como un tipo ARRAY y no como un objeto (como lo es en .NET), por lo que no podremos acceder a las propiedaes del array, tal como Lenght, pero si a sus items:

aItems = myClass.MyMethod()
FOR EACH oItem IN aItems
 ?oItem.Property
ENDFOR

o

aItems = myClass.MyMethod()
FOR i = 1 TO ALEN(aItems,1)
oItem = aItems[i]
 ?oItem.Property
ENDFOR

7. Antes de compilar la clase, debes ir a las propiedades del proyecto, Application, boton Assembly Information y marcar la casilla "Make assembly COM-visible"

8. Debes firmar la DLL. Para esto, sigue los pasos indicados aqui

9. Una vez compilada la dll, la misma debe ser registrada de la siguiente forma antes de poder ser usada en VFP:

Windows 32 bits:
C:\WINDOWS\microsoft.net\framework\v2.0.50727\regasm mylib.dll /register /codebase /tlb

Windows 64 bits
C:\WINDOWS\microsoft.net\framework64\v2.0.50727\regasm mylib.dll /register /codebase /tlb



3 comentarios:

Anónimo dijo...

Interesante, pero por que no pones un ejemplo. Para aquellos que estamos iniciando in VS2008, y explorando las posibilidades para no dejar de Programar en Visual Fox

Anónimo dijo...

consulta. He creado mi Dll en Net C# haciendo referencia al Web Service de la Sunat .. todo bien en Net .. pero cuando quiero Registrar la Dll en mi Pc Me sale Error y lo quiero utilizar con VFP

Shared DLL WebService dijo...

Por qué no compartes la dll. Harias una buena contribucion a la comunidad.