我在导入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;
我不认为安全数组使用结构,而另一个显然不是数组。
任何想法/链接/非常感谢。
答案 0 :(得分:0)
// 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将其转换回原始结构。
它有点笨重,但它确实有效。