IR
irwinrodriguez.dev
Volver a documentación

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.

Crear el puente y activar la licencia
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.

StringBuilder: el hola mundo de .NET
* 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.

List<String> y Dictionary desde 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, System.IO.File y un enum por su nombre
* 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ú.

Cargar tu propia DLL y usar una de sus clases
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
Regla de oro Libera los objetos de FoxBridge con = .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 ->