Im August 2014 wurde auf dem Treffen gezeigt, wie einfach sich DotNet-Komponenten aus FoxPro heraus aufrufen lassen, in dem man wwDotnetBridge von Rick Strahl (http://west-wind.com/wwDotnetBridge.aspx) einsetzt. wwDotnetBridge wird als freie Version incl. Sourcecode zur Verfügung gestellt. Es ist aber auch eine kommerzielle Lizenz verfügbar um entsprechenden Support zu erhalten oder einfach das Projekt zu unterstützen…
Um wwDotnetBridge unter VFP einzusetzen, benötigt man die folgenden Dateien aus dem Download:
Einfache Anwendung
Das mitgelieferte Beispiel zeigt, wie einfach man z.B. die Liste der laufenden Prozesse in einen Cursor einlesen kann:
LOCAL loBridge as wwDotNetBridge OF wwDotNetBridge.prg do wwDotNetBridge && Load library loBridge = CreateObject("wwDotNetBridge","V4") *** Returns a ComArray instance loProcesses = loBridge.Invokestaticmethod("System.Diagnostics.Process","GetProcesses") lcOutput = "" CREATE CURSOR prozesse( pname c(40), threads i, workset n(10)) CLEAR *** Note most .NET Arrays are 0 based! FOR lnX = 0 TO loProcesses.Count -1 *** Access raw COM Interop objects loProcess = loProcesses.Item(lnX) INSERT INTO prozesse (pname, threads , workset); VALUES (loProcess.ProcessName, loProcess.Threads.count,loProcess.WorkingSet) ENDFOR GO TOP browse LAST loBridge.unload()
Mögliche Performaceverbesserungen
Weiterhin wurde gezeigt, dass man z.B. rechenintensive Programmteile sehr einfach auslagern kann und so u.U. erhebliche Performanceverbesserungen erreichen kann.
Im folgenden Beispiel wird z.B. in einer Million Durchläufen eine Summe gebildet. Der erste Durchlauf erfolgt in nativem FoxPro-Code. Der 2. Durchlauf erfolgt innerhalb einer selbst erzeugten .Net-DLL. In diesem Fall dauerte die Berechnung in VFP rund 0,4 Sekunden und in .net 0,001 Sekunden…
LOCAL loBridge as wwDotNetBridge OF wwDotNetBridge.prg LOCAL loRechnen do wwDotNetBridge && Load library loBridge = CreateObject("wwDotNetBridge","V4") *** Load our custom assembly loBridge.LoadAssembly("MeineDLL.dll") IF loBridge.lError ? loBridge.cErrorMsg RETURN ENDIF loRechnen = loBridge.CreateInstance("MeineNetVersucheDLL.rechnen") IF loBridge.lError ? loBridge.cErrorMsg RETURN ENDIF LOCAL lnAnzahl, ln, lnStart, lnSum lnAnzahl = 1000 * 1000 lnStart = SECONDS() ? "=================================" ? "VFP, Durchläufe:", lnAnzahl lnSum = 0 FOR ln=0 TO lnAnzahl STEP 1 lnSum = lnSum + ln ENDFOR ? "Ergebnis:", TRANSFORM(lnSum,"999,999,999,999") ? "Dauer: ", SECONDS()-lnStart ? "--------------------------------" lnStart = SECONDS() ? ".Net, Durchläufe:", lnAnzahl lnSum = loBridge.Invokemethod(loRechnen,"schleife",lnAnzahl) ? "Ergebnis:", TRANSFORM(lnSum,"999,999,999,999") ? "Dauer: ", SECONDS()-lnStart loBridge.unload()
namespace MeineDLL { public class rechnen { public Int64 schleife(Int32 anzahl) { Int64 summe = 0; for (Int64 i = 0; i <= anzahl; i++) { summe = summe + i; } return summe; } } }