如何为非托管导出声明数组类型

时间:2012-11-30 09:05:08

标签: c# delphi

我正在使用UnmanagedExports从Delphi Win32程序调用.NET C#类库函数。像魅力一样工作!

我还没有发现如何在C#和Delphi端声明数组类型(如int []或IMyUnknownBasedInterface []),以便我可以在两种语言之间交换数组。如果不可能,我也很乐意使用某种集合对象或索引器方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在C#方面这样做:

[DllExport("Foo", CallingConvention = CallingConvention.Stdcall)]
static extern void Foo(int[] a, int len);

在Delphi方面这样:

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

答案 1 :(得分:0)

这在C#方面很容易,但它可以是德尔福方面的皇家PITA。

这里的问题是,如果你有一个接口的Array属性从本机编组,那么CLR对于数组大小将非常挑剔。

你最好的镜头是一个安全的数组,很容易用C#...

声明
public interface ISample
{
    int[] YourArray
    {
        [return:MarshalAs(UnmanagedType.SafeArray)]
        get;
    }

然而,在Delphi方面处理安全数组非常痛苦。

对于我自己的东西,我根本没有在本机和C#之间共享的接口中发布数组。 我使用了一个模仿IEnumerable的接口,但可以在Delphi或C#中轻松实现。

当你让它返回另一个提供方法MoveNext,GetCurrent和属性Current的接口时,C#和Delphi都可以让你愉快地使用它。