Domanda

Le esportazioni non gestiti di creare una dll nativo NET dll modo che io possa accedere al codice .NET da Delphi senza registrazione COM.

Per esempio io ho questo assembly .NET:

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();
      }
   }
}

Quando definisco la stessa interfaccia in Delphi, posso facilmente utilizzare l'oggetto NET:

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.

Delphi e risposte per i dettagli.

La mia domanda:
E 'qualcosa di simile a questo possibile in FoxPro? Ho provato quanto segue, che non riesce con tipo di dati non corrispondente errore sulla linea createdotnetadder(@ldnw):

DECLARE createdotnetadder IN DelphiNET.dll object @ ldnw
ldnw = 0
createdotnetadder(@ldnw)
loObject = SYS(3096, ldnw)
? loObject.Add3(4)

Posso definire l'interfaccia in FoxPro simile come ho fatto in Delphi? In caso contrario, posso usare questa dll da FoxPro a tutti? Io uso Visual FoxPro 9.0 SP2. Grazie.

È stato utile?

Soluzione

Sembra che l'approccio più semplice è quello di vivere con COM registrazione. L'approccio alternativo è di ospitare manualmente CLR. Rick Strahl ha una vasta post su come fare fare questo da FoxPro:

http://www.west-wind.com /wconnect/weblog/ShowEntry.blog?id=631

Altri suggerimenti

È inoltre possibile utilizzare il wwDotnetBridge progetto che automatizza il runtime CLR processi hosting per voi e fornisce una serie di altre funzioni di supporto che rendono più facile consumare i tipi e strutture .NET in FoxPro.

loBridge = CREATEOBJECT("wwDotnetBridge","V4")
loBridge.LoadAssembly("MyAssembly.dll")
loInstance = loBridge.CreateInstance("MyNamespace.MyClass")

loInstance.DoSomething(parm1)
loBridge.InvokeMethod(loInstance,"SomeOtherMethodWithUnsupportedTypeParms",int(10))

wwDotnetBridge gestisce la creazione di oggetti per voi e passa indietro esempio COM altrettanto nativo interoperabilità COM fa, ma offre funzionalità aggiuntive altrimenti non accessibili attraverso l'interoperabilità COM:

  • L'accesso ai metodi statici e ai membri
  • L'accesso ai tipi di valore
  • Il supporto per l'aggiornamento array e collezioni
  • Il supporto per i metodi e costruttori di overload
  • L'accesso ai tipi generici

e molti aiutanti per farvi aggirare le limitazioni del COM -..> Mappature netto generato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top