Foxpro و .net com بدون تسجيل
-
23-09-2019 - |
سؤال
أنا أستعمل الصادرات غير المدارة لإنشاء .DLL الأصلي من .NET .DLL حتى أتمكن من الوصول إلى رمز .NET من Delphi بدون تسجيل COM.
على سبيل المثال لدي هذا .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();
}
}
}
عندما أقوم بتحديد الواجهة نفسها في دلفي ، يمكنني بسهولة استخدام كائن .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.
انظر بلدي سؤال وإجابات دلفي للتفاصيل.
سؤالي:
هل شيء من هذا القبيل ممكن في 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. شكرًا.
المحلول
يبدو أن أبسط نهج هو العيش مع تسجيل كوم. النهج البديل هو استضافة CLR يدويًا. ريك ستراهل لديه منشور واسع حول كيفية القيام بذلك من Foxpro:
http://www.west-wind.com/wconnect/weblog/showentry.blog؟id=631
نصائح أخرى
يمكنك أيضًا استخدام المصدر المفتوح مشروع wwdotnetbridge الذي يعمل على أتمتة عمليات استضافة وقت تشغيل CLR لك ويوفر مجموعة من ميزات الدعم الأخرى التي تسهل استهلاك أنواع وهياكل .NET في 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 interop الأصلي ، لكنه يوفر ميزات إضافية لا يمكن الوصول إليها من خلال com interop:
- الوصول إلى الأساليب والأعضاء الثابتة
- الوصول إلى أنواع القيمة
- دعم لتحديث المصفوفات والمجموعات
- دعم الأساليب والمصممين المحملين
- الوصول إلى أنواع عامة
والعديد من المساعدين للسماح لك بالتنقل حول القيود في com->. التعيينات الصافية المقدمة.