Inicio rápido
En menos de cinco minutos tendrás tu primera clase .NET corriendo desde VFP.
Paso 1: inicializar y activar
Una sola vez, al arrancar tu aplicación. Activate() no es un extra: la licencia se comprueba en cada punto de entrada del motor, así que sin ella no se crea ni un objeto.
LOCAL loBridge
loBridge = NEWOBJECT("FoxBridge", "FoxBridge.prg")
IF !loBridge.Activate(MiSistema_ObtenerLicencia())
? "FoxBridge: " + loBridge.GetLastError()
RETURN
ENDIF
* Comprobacion opcional de que todo ha cargado:
? loBridge.Version() && FoxBridge Runtime 1.0.0 / Core ...Paso 2: crear tu primer objeto .NET
System.Text.StringBuilder es una clase .NET que construye cadenas de forma eficiente. Es el «hola mundo» de FoxBridge.
* Crear un StringBuilder con texto inicial
loSB = loBridge.Create("System.Text.StringBuilder", "Hola ")
* Llamar metodos, con la sintaxis de punto de siempre
loSB.Append("mundo ")
loSB.Append("desde .NET!")
* Convertir a cadena de VFP
? loSB.ToString() && "Hola mundo desde .NET!"
* Y leer una propiedad
? loSB.Length && 22
* Liberar
loSB = .NULL.Paso 3: trabajar con colecciones genéricas
FoxBridge traduce List<T> y Dictionary<K,V> a proxies de VFP. La indexación es base 1, como en VFP.
* Crear una List<String>
loLista = loBridge.Create("List<String>")
loLista.Add("Visual FoxPro")
loLista.Add("C#")
loLista.Add("F#")
? "Total:", loLista.Count() && 3
? "Primero:", loLista.Item(1) && "Visual FoxPro"
FOR i = 1 TO loLista.Count()
? loLista.Item(i)
ENDFOR
loLista.Remove("F#")
? "Después de Remove:", loLista.Count() && 2
* Un Dictionary<K,V>. Ojo: el metodo es ContainsKey, no Contains.
loDic = loBridge.Create("Dictionary<String,String>")
loDic.Set("nombre", "Irwin")
? loDic.Get("nombre") && "Irwin"
? loDic.ContainsKey("nombre") && .T.
? loDic.Count() && 1
loLista = .NULL.
loDic = .NULL.Item() y Get() devuelven el valor, que es lo que quieres cuando la colección guarda cadenas o números. Si lo que hay dentro es un objeto .NET, pide el proxy con GetObject().
Paso 4: llamar métodos estáticos
Muchas clases .NET tienen miembros estáticos, sin instanciar nada. Se llega a ellos con loBridge.Static().
* System.Math es una clase estatica
loMath = loBridge.Static("System.Math")
? loMath.Abs(-42) && 42
? loMath.Sqrt(144) && 12
? loMath.Max(10, 20) && 20
? loMath.PI && 3.14159...
* System.IO.File: leer y escribir ficheros
loFile = loBridge.Static("System.IO.File")
loFile.WriteAllText("C:\prueba.txt", "Hola desde FoxBridge")
? loFile.Exists("C:\prueba.txt") && .T.
? loFile.ReadAllText("C:\prueba.txt")
* Los enums tambien son proxies estaticos, y sus miembros se leen
* por su nombre en lugar de escribir el numero:
loFileMode = loBridge.Static("System.IO.FileMode")
? loFileMode.Create && 2
loMath = .NULL.
loFile = .NULL.Paso 5: cargar tu propia DLL
FoxBridge carga cualquier DLL de .NET que hayas compilado tú.
llOk = loBridge.LoadAssembly("C:\MiApp\bin\MiLogica.dll")
IF llOk
loObj = loBridge.Create("MiEmpresa.MiLogica.Calculadora", 0.16)
lnTotal = loObj.CalcularConIVA(1000.00)
? "Total con IVA:", lnTotal
loObj = .NULL.
ELSE
? "Error:", loBridge.GetLastError()
ENDIF= .NULL. cuando ya no los necesites: eso libera la memoria del lado .NET. Y recuerda que GetLastError() se consume al leerlo: la segunda lectura seguida ya viene vacía, así que guárdatelo en una variable si lo vas a usar dos veces. Siguiente: Ejemplos ->