我正在使用UnmanagedExports从 Delphi Win32 程序中调用 .NET C# 类库函数。像魅力一样工作!
我还没有发现如何在 C# 和 Delphi 端声明数组类型(如 int[] 或 IMyUnknownBasedInterface[]),以便我可以在两种语言之间交换数组。如果不可能,我也很乐意使用某种集合对象或索引器方法。
有任何想法吗?
我正在使用UnmanagedExports从 Delphi Win32 程序中调用 .NET C# 类库函数。像魅力一样工作!
我还没有发现如何在 C# 和 Delphi 端声明数组类型(如 int[] 或 IMyUnknownBasedInterface[]),以便我可以在两种语言之间交换数组。如果不可能,我也很乐意使用某种集合对象或索引器方法。
有任何想法吗?
在 C# 端这样做:
[DllExport("Foo", CallingConvention = CallingConvention.Stdcall)]
static extern void Foo(int[] a, int len);
在德尔福方面是这样的:
procedure Foo(a: PInteger; len: Integer); stdcall; external 'manageddll.dll';
要从 Delphi 调用该函数,您可以这样做:
var
a: array of Integer;
....
SetLength(a, 666);
//populate a
Foo(PInteger(a), Length(a));
这在 C# 方面很容易,但在 Delphi 方面它可以是皇家 PITA。
这里的问题是,如果你有一个从本机编组的接口的数组属性,那么 CLR 将对数组大小非常挑剔。
你最好的选择是一个安全的数组,它很容易在 C# 中声明......
public interface ISample
{
int[] YourArray
{
[return:MarshalAs(UnmanagedType.SafeArray)]
get;
}
然而,在 Delphi 方面处理安全数组是相当痛苦的。
对于我自己的东西,我根本没有在本机和 C# 之间共享的接口中发布数组。我使用了一个模仿 IEnumerable 的接口,但可以在 Delphi 或 C# 中轻松实现。
当您让它返回另一个提供方法 MoveNext、GetCurrent 和属性 Current 的接口时,C# 和 Delphi 都会让您愉快地 foreach 处理它。