通过COM将结构/记录的C样式数组从delphi 5传递到C#

时间:2012-09-14 07:35:00

标签: c# delphi com-interop

我在导入Delphi 5和C#程序集的类型库中定义了一个结构。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MyStruct
{
    public uint a;
    public float b;
}

MyStruct = packed record
    a: LongWord;
    b: Single;
end;

在Delphi端,我有一个指向所有结构的C风格数组的指针,我希望通过COM传递给C#程序集。理想情况下,我希望最终在c#端作为myStruct [],但我会指向一个正确编组的内存块,因为结构都是blittable。

我尝试过的两种方法是

void DoFoo([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] MyStruct[] fooArray, int size);
void DoBar(MyStruct[] barArray, int length);
转换为类型库并导入到delphi后的

procedure DoFoo(var fooArray: MyStruct; size: Integer); safecall;
procedure DoBar(barArray: PSafeArray; length: Integer); safecall;

我不认为安全数组使用结构,而另一个显然不是数组。

任何想法/链接/非常感谢。

1 个答案:

答案 0 :(得分:0)

实际上,我确实将delphi中的结构作为一个safearray传递给c#作为byte []。

// C# interop method.
void DoFoo(byte[] myStructs); 

// Delphi SafeArray creation
size := fooNumber* sizeof(Foo);
arrayBounds.lLbound :=  0;
arrayBounds.cElements := size;
safeArray := SafeArrayCreate( varByte, 1, arrayBounds );
SafeArrayLock(safeArray);
Move(pointerToFooArray^, safeArray.pvData^, size);
SafeArrayUnlock(safeArray);
auroraDiagnostics.DoFoo(safeArray);

然后我使用this solution将其转换回原始结构。

它有点笨重,但它确实有效。