domingo, 16 de octubre de 2016

CREAR .DLL EN C# PARA USAR EN VFP 9 PASO A PASO (PARTE 1)


MANUAL CREACION .DLL EN C# PARA USAR EN VFP 9.0 (Win 7)

AUTOR : MILTON CACHIPUENDO, Servysistem Online, Ibarra – Ecuador, 0986 104-104


1.       INTRODUCCION
                Luego de realizar una extensa investigación para lograr dar la funcionalidad de Facturación Electrónica (eFactura)  a mi sistema Omega, llegué a definir  el proceso que se necesita para la solución, resumiendo esto: (1) Añadir los campos  necesarios a la Base de Datos, (2) Crear el XML de la factura electrónica, (3) Firmar el XML y (4) enviar al SRI para autorizarlo. Todo bien hasta que me topé con la limitación de que VFP no es un lenguaje que permita ejecutar el proceso de firmar un XML. Afortunadamente encontré una librería denominada FirmaXAdesNet.DLL de licencia GNU desarrollada en España y que permite realizar este trabajo. Pero el problema es que esta librería no es utilizable desde VFP ya que está hecha para entornos de desarrollo de .NET, pero no puede usarse desde VFP porque  requiere sea ensamblada con ciertas particularidades. Por lo que en mi inmenso afán de conocer e implementar mis propias soluciones, me aventuro en crear mi propia librería.
                Para esto tengo que conocer primeramente como crear una librería .DLL en C# que cumpla con los requisitos necesarios para poder usarla desde mi amado Fox. Para esto debo partir desde un conocimiento básico y  en las líneas siguientes detallo un ejemplo sencillo y paso a paso para generar la DLL utilizando Visual Studio 2010 y el lenguaje C#. Posteriormente en otra entrega indicaré como logré firmar el XML de la Factura electrónica para que sea usable en aplicaciones VFP.
                Este ejemplo existe ya en internet, por lo que aunque no detallo los autores por no alargarme mucho procedo a documentarlo paso a paso como lo pude hacerlo, quizá sirva a otros colegas.

2.       CREAR LA DLL
                Este ejemplo fue ejecutado en la plataforma Windows 7, previamente instalado Visual Studio 2010, FrameWork 4.0 de Windows y  Visual Foxpro 9 SP2, una vez que tenemos instalados los requisitos previos ya podemos desarrollar el ejemplo.
                Ingresar  a Visual Studio 2010 ir al menú File, opciones New, Project, se muestra la ventana New Project, en esta ventana navegamos en el árbol de Installed Templates, seleccionamos Visual C#, Windows, de la lista de la derecha seleccionamos Class Library en Name escribimos el nombre de la Clase a crear en nuestro caso la llamaremos VFPMath, en Location indicamos la ruta donde se creará el proyecto que será C:\VFPMath, luego OK.
                A la derecha en el árbol del proyecto buscar Class1.cs y reemplazar el siguiente código que seguidamente procederé a describir.





*


*
*
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace VFPMATH {
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("VFPMath.MathFunctions")]
    public class MathFunctions :  System.EnterpriseServices.ServicedComponent {
        public Int32 Add(Int32 x, Int32 y) { return(x + y);}
        public Int32 Subtract(Int32 x, Int32 y) { return(x - y);}
        public Int32 Multiply(Int32 x, Int32 y) { return(x * y);}
        public Int32 Divide(Int32 x, Int32 y) { return(x / y);}
    }

*  Son líneas que no pueden excluirse para usar desde VFP.

                Considero que el lector es un programador de nivel medio que tiene algo de experiencia en programación C#, por lo que será muy obvio las líneas de código anteriores, en resumen se crea una DLL llamada VFPMath, que implementa una Clase pública llamada MathFunctions, que tiene varios métodos públicos  (Add, Substract, Multiply y Divide) que realizan las operaciones matemáticas indicadas.
                Vemos una estructura propia para crear un objeto COM por lo que las línea  (using System.Runtime.InteropServices;) es requisito y no puede excluirse. Las líneas que prosiguen a namespace siempre debe estructurarse así, es decir la clase MathFunctions debe estar dentro del namespace. Tampoco se pueden excluir los atributos ([ClassInterface(ClassInterfaceType.AutoDual)] y [ProgId("VFPMath.MathFunctions")]), con esto ya tenemos todo el código que requerimos para el ejemplo.

                Lo siguiente es establecer unas dos propiedades adicionales y listo, para esto en Solution Explorer abrimos el menú de contexto de  C# VFPMath y escogemos Properties, en la pestaña Application hacemos click en Assembly Information… en la ventana que se abrió activamos la casilla Make Assembly COM-Visible.
                En la pestaña Signing (firmando) seleccione activamos la casilla Sign the Assembly, en el combo box seleccione New…, al abrirse la siguiente ventana de una nombre al archivo de firma en nuestro caso será VFPMath, desactive la opción Protect my key file with a password, luego OK.
               
En Solution Explorer abrimos el menú de contexto de References, seleccionamos Add Reference… , en la pestaña .NET, buscamos System.EnterpriseServices y luego OK, como muestra en la figura de la siguiente página.


Con esto está lista nuestra DLL, para generarla en Solution Explorer abrimos el menú de contexto de  Solution VFPMath  y seleccionamos la opción Built Solution. Ahora nuestra solución se encuentra en el directorio: c:\VFPMath\ VFPMath\ VFPMath\Bin\Debug.



3.       REGISTRAR LA DLL
                Ahora busco el archivo RegAsm.exe,  lo he localice en el siguiente directorio  C:\Windows\Microsoft.NET\Framework\v4.0.30319  procedo a copiar al directorio donde se creó mi  VFPMath.DLL, esto es en la carpeta C:\VFPMath\ VFPMath\ VFPMath\Bin\Debug. En este punto ya puedo registrar la librería, ejecuto como Administrador del Sistema el Símbolo del Sistema y luego el siguiente comando:
RegAsm VFPMath.dll /codebase


4.       USANDO LA LIBRERÍA DESDE VFP.
Una vez que está registrada esta librería estará disponible en cualquier momento y podemos ahora usarla, con el siguiente código fox podemos hacerlo, creamos el programa VFPMath.PRG, y seguidamente lo ejecutamos.
oVFPMath = CreateObject("VFPMath.MathFunctions")
?oVFPMath.add(5,4)
?oVFPMath.subtract(5,4)
?oVFPMath.multiply(5,4)
?oVFPMath.divide(5,4)



10 comentarios:

  1. gracias eres lo máximo, estaba buscando hace tiempo como hacer esto

    ResponderBorrar
  2. Gracias, a ver si le entro c# alguna vez.

    ResponderBorrar
  3. Infinitas gracias amigo me sirvío de mucho

    ResponderBorrar
  4. quiero crear una DLL que contenga una clave del sistema en vfp90. es posible que esa dll sea decompilada y poder leer su contenido

    ResponderBorrar
    Respuestas
    1. Del mismo modo, como en el ejemplo arriba. Pero debes asegurar la .DLL para que no la decompilen. Te sugiero intentes asegurar con Enigma Virtual Box, para evitar que la descompilen.

      Borrar
    2. me podria colaborar tengo algunos detalles que no me dejan consumir la dll creada en C# agradeceria su colaboracion

      Borrar
  5. Muchas gracias por compartir el conocimiento, me sirvió de mucho!

    ResponderBorrar