dotnet Klassen in VFP aufrufen..

13/05/2008 - 16:09 von Sven Schmalle | Report spam
Hallo ihr lieben Mitfüchse,
ich hoffe ihr habt auch so schönes Wetter wie ich hier in Bremen :o)

Hier geht es um die einbindung von .NET klassen in VFP.

Dazu habe ich am Wochenende vom Rick Strahl einen etwas àlteren Eintrag in seinem Blog gefunden: http://west-wind.com/weblog/posts/104449.aspx
In diesem Eintrag geht es darum .NET Klassen ohne COM-Registrierung quasi Direkt in VFP aufzurufen.

Das hab ich gleich mal getestet und ausprobiert.
Jetzt bin ich damit soweit das ich ein .NET Formular aus einer .NET DLL in VFP aufrufen kann.

Dafür hab ich die clrhost.dll von Rick Strahl genommen (http://www.west-wind.com/files/tool...lrhost.zip) und eine selbst gebaute .NET DLL.



In der .NET DLL befindet sich nur ein Formular und die Methode formtest():

-
using System;
using System.Collections.Generic;
using System.Text;

namespace dlltestvfp
{
public class Class1
{
public void formtest()
{
Form1 frm1 = new Form1();
frm1.Show();
}
}
}
-





Für den VFP teil hab ich ein PRG (CreateClrInstanceFrom.prg) mit folgendem inhalt (vom Rick Strahl):

-
************************************************************************
* CreateClrInstanceFrom
************************************************************************
*** Function: Creates an instance of a .NET class by referencing
*** a fully qualified assembly path.
*** Pass: lcLibrary - fully qualified path to the assembly
*** including extension
*** lcClass - MyNamespace.MyClass
*** Return: Instance or NULL
************************************************************************
FUNCTION CreateClrInstanceFrom(lcLibrary,lcClass,lcError)
LOCAL lnDispHandle, lnSize

DECLARE Integer ClrCreateInstanceFrom IN ClrHost.dll string, string, string@, integer@

lcError = SPACE(2048)
lnSize = 0
lnDispHandle = ClrCreateInstanceFrom(lcLibrary,lcClass,@lcError,@lnSize)

IF lnDispHandle < 1
lcError = LEFT(lcError,lnSize)
RETURN NULL
ENDIF

RETURN SYS(3096, lnDispHandle)
ENDFUNC
-



Im Init eines VFP-Formulars (nettest.scx) habe ich:
-
CLEAR

lcError = ""

*Pfad zur .NET-DLL (Liegt für dieses Beispiel im selben Verzeichnis wie das PRG)
lcSysDll = FULLPATH("dlltestvfp.dll")

*Klasse der DLL Instanziieren (dll.Class1)
loTest = CreateClrInstanceFrom(lcSysDLL,"dlltestvfp.Class1",@lcError)
thisform.obj = loTest
*Sollte ein Fehler passieren, wird er hier angezeigt
IF ISNULL(loTest)
? lcError
RETURN
ENDIF

RETURN
-
Thisform.obj ist hierbei eine Formular-Eigenschaft


Und in dem Click-Event eines Buttons folgendes:
-
thisform.obj.formtest()
-

Rick Strahl seine clrhost.dll, meine selbst geschriebene .NET DLL, das prg und das Formular liegen im selben Verzeichnis.

Führe ich das Formular nun aus und klicke auf den Button, wird die .NET DLL geladen und das .NET Formular in der .NET DLL angezeigt.
Soweit, so schön :)

Wenn ich dieses Formular nun aber wieder schliesse und danach das VFP-Formular schließe, stürtzt mein VFP ab - jedes mal :-(

Wenn jetzt jemand von euch eine Idee dazu hat (vll einfach nur die Objekte freigeben - wobei ich grad nicht wüsste wie ich das am besten mache? null?) wàre ich über diese Ideen dankbar.

Vielleicht hat ja auch jmd lust das ganze selbst mal zu versuchen - notfalls stell ich meine Sachen auch als zip zur verfügung :-)

Ja.. Vielen Dank dazu im Vorraus,
Sven
 

Lesen sie die antworten

#1 Olaf Doschke
13/05/2008 - 16:41 | Warnen spam
Wenn jetzt jemand von euch eine Idee dazu hat (vll einfach nur die Objekte
freigeben - wobei ich grad nicht wüsste wie ich das am besten mache? null?)
wàre ich über diese Ideen dankbar.


thisform.obj = .null. wàre eine Idee.

Im QueryUnload() Event und in der Release() Methode müßte
es wohl rein. Eine Formeigenschaft sollte beim normalen
Release/Unload allerdings schon entsorgt werden.

Eventuell brauchst Du aber zum SYS(3096), was eine für
VFP verdaubare IDispatch Objektreferenz aus einem
Pointer erzeugt zum Freigeben ein SYS(3098,Thisform.obj),
um diese Objektreferenz samt Speicher sauber freizugeben.

Tschüß, Olaf.

Ähnliche fragen