Benutzer-Werkzeuge

Webseiten-Werkzeuge


entwicklertreffen:140814

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:

  • „ClrHost.dll“
  • „wwDotNetBridge.dll“
  • „wwDotnetBridge.PRG“
  • „wwDotNetBridge.xml“

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;
        }
    }
}
Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
entwicklertreffen/140814.txt · Zuletzt geändert: 19.08.2014 14:06 (Externe Bearbeitung)