我正在使用UnmanagedExports从Delphi Win32程序调用.NET C#类库函数。像魅力一样工作!
我还没有发现如何在C#和Delphi端声明数组类型(如int []或IMyUnknownBasedInterface []),以便我可以在两种语言之间交换数组。如果不可能,我也很乐意使用某种集合对象或索引器方法。
有什么想法吗?
答案 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都可以让你愉快地使用它。