FoxPro und .NET COM ohne Registrierung
-
23-09-2019 - |
Frage
Ich benutze Unmanaged Exporte eine native DLL erstellen aus .NET-DLL, so kann ich .NET-Code von Delphi zugreifen, ohne COM-Registrierung.
Zum Beispiel habe ich diese .NET Assembly:
using System;
using System.Collections.Generic;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace DelphiNET
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("ACEEED92-1A35-43fd-8FD8-9BA0F2D7AC31")]
public interface IDotNetAdder
{
int Add3(int left);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class DotNetAdder : DelphiNET.IDotNetAdder
{
public int Add3(int left)
{
return left + 3;
}
}
internal static class UnmanagedExports
{
[DllExport("createdotnetadder", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
static void CreateDotNetAdderInstance([MarshalAs(UnmanagedType.Interface)]out IDotNetAdder instance)
{
instance = new DotNetAdder();
}
}
}
Wenn ich die gleiche Schnittstelle in Delphi definieren, kann ich einfach das .NET-Objekt verwenden:
type
IDotNetAdder = interface
['{ACEEED92-1A35-43fd-8FD8-9BA0F2D7AC31}']
function Add3(left : Integer) : Integer; safecall;
end;
procedure CreateDotNetAdder(out instance : IDotNetAdder); stdcall;
external 'DelphiNET' name 'createdotnetadder';
var
adder : IDotNetAdder;
begin
try
CreateDotNetAdder(adder);
Writeln('4 + 3 = ', adder.Add3(4));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Sehen Sie meine Delphi Fragen und Antworten .
Meine Frage:
Ist so etwas möglich in FoxPro? Ich habe folgendes versucht, die mit nicht Datentypenkonflikt Fehler in Zeile createdotnetadder(@ldnw)
:
DECLARE createdotnetadder IN DelphiNET.dll object @ ldnw
ldnw = 0
createdotnetadder(@ldnw)
loObject = SYS(3096, ldnw)
? loObject.Add3(4)
kann ich definieren Schnittstelle in FoxPro in ähnlicher Weise, wie ich tat es in Delphi? Wenn nicht, kann ich diese DLL von FoxPro überhaupt verwenden? Ich benutze Visual FoxPro 9.0 SP2. Danke.
Lösung
Es scheint, dass der einfachste Ansatz ist mit COM-Registrierung zu leben. Der alternative Ansatz ist es, manuell die CLR zu hosten. Rick Strahl hat einen umfangreichen Beitrag, wie Sie tun dies aus FoxPro:
http://www.west-wind.com /wconnect/weblog/ShowEntry.blog?id=631
Andere Tipps
Sie können auch die Open-Source verwenden wwDotnetBridge Projekt , die die CLR-Laufzeit-Hosting-Prozesse für Sie automatisiert und bietet eine Vielzahl von anderen Support-Funktionen, die es einfacher zu konsumieren .NET-Typen und Strukturen in FoxPro.
machenloBridge = CREATEOBJECT("wwDotnetBridge","V4")
loBridge.LoadAssembly("MyAssembly.dll")
loInstance = loBridge.CreateInstance("MyNamespace.MyClass")
loInstance.DoSomething(parm1)
loBridge.InvokeMethod(loInstance,"SomeOtherMethodWithUnsupportedTypeParms",int(10))
wwDotnetBridge Griff Objekterstellung für Sie und gehen zurück COM-Instanz nur als native COM-Interop tut, aber es bietet zusätzliche Funktionen sonst nicht zugänglich durch COM-Interop:
- Zugriff auf statische Methoden und Mitglieder
- Zugriff auf Werttypen
- Unterstützung für die Aktualisierung Arrays und Sammlungen
- Unterstützung für überladene Methoden und Konstrukteuren
- Zugriff auf generische Typen
und viele Helfer, damit Sie die Einschränkungen in der COM um arbeiten -..> NET-Mappings zur Verfügung gestellt