FoxPro и .NET COM без регистрации - PullRequest
3 голосов
/ 01 марта 2010

Я использую Неуправляемый экспорт для создания собственного .dll из .NET .dll, чтобы я мог получить доступ к .NET коду из Delphi без регистрации COM.

Например, у меня есть. 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();
      }
   }
}

Когда я определяю тот же интерфейс в Delphi, я легко могу использовать объект .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 вопрос и ответы .

Мой вопрос:
Возможно ли что-то подобное в FoxPro? Я пробовал следующее, что не с Несоответствие типов данных Ошибка в строке createdotnetadder(@ldnw):

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

Могу ли я определить интерфейс в FoxPro так же, как я это сделал в Delphi? Если нет, могу ли я вообще использовать этот .dll из FoxPro? Я использую Visual FoxPro 9.0 SP2. Спасибо.

Ответы [ 2 ]

1 голос
/ 03 марта 2010

Кажется, что самый простой подход - это жить с регистрацией COM. Альтернативный подход заключается в том, чтобы вручную разместить CLR. У Рика Страл есть обширный пост о том, как это сделать из FoxPro:

http://www.west -wind.com / wconnect / блог / ShowEntry.blog? ID = 631

0 голосов
/ 18 марта 2017

Вы также можете использовать проект с открытым исходным кодом wwDotnetBridge , который автоматизирует процессы хостинга среды выполнения CLR и предоставляет множество других вспомогательных функций, облегчающих использование типов и структур .NET в FoxPro. 1003 *

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

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

wwDotnetBridge обрабатывает создание объектов для вас и передает обратно экземпляр COM так же, как это делает нативное взаимодействие COM, но предоставляет дополнительные функции, в противном случае недоступные через взаимодействие COM:

  • Доступ к статическим методам и членам
  • Доступ к типам значений
  • Поддержка обновления массивов и коллекций
  • Поддержка перегруженных методов и конструкторов
  • Доступ к универсальным типам

и множество помощников, позволяющих обойти ограничения в предоставляемых сопоставлениях COM -> .NET.

...