FoxPro и .NET COM без регистрации
-
23-09-2019 - |
Вопрос
Я использую Неуправляемый Экспорт создать собственную .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.Спасибо.
Решение
Кажется, что самый простой подход - это жить с регистрацией на COM.Альтернативный подход заключается в ручном размещении среды CLR.У Рика Страла есть обширный пост о том, как это сделать, от FoxPro:
http://www.west-wind.com/wconnect/weblog/ShowEntry.blog?id=631
Другие советы
Вы также можете использовать открытый исходный код Проект wwDotnetBridge который автоматизирует для вас процессы хостинга среды CLR runtime и предоставляет множество других функций поддержки, упрощающих использование.Типы и структуры сетей в FoxPro.
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.