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)
gracias eres lo máximo, estaba buscando hace tiempo como hacer esto
ResponderBorrarNuy buena
ResponderBorrarGracias, a ver si le entro c# alguna vez.
ResponderBorrarTiene terminados los componentes?
ResponderBorrarInfinitas gracias amigo me sirvío de mucho
ResponderBorrargracias brother
ResponderBorrarquiero crear una DLL que contenga una clave del sistema en vfp90. es posible que esa dll sea decompilada y poder leer su contenido
ResponderBorrarDel 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.
Borrarme podria colaborar tengo algunos detalles que no me dejan consumir la dll creada en C# agradeceria su colaboracion
BorrarMuchas gracias por compartir el conocimiento, me sirvió de mucho!
ResponderBorrar