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.

War es hilfreich?

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.

machen
loBridge = 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top