1

我在导入 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# 程序集。理想情况下,我希望它以 myStruct[] 的形式出现在 c# 端,但我将使用一个指向正确编组的内存块的指针,因为这些结构都是 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;

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

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

4

1 回答 1

0

事实上,我确实将 delphi 中的结构作为安全数组传递,它作为 byte[] 传递给 c#。

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

然后我使用此解决方案将其转换回原始结构。

这有点笨拙,但它确实有效。

于 2012-09-18T03:31:20.870 回答