2012-09-14 51 views
1

我有一个类型库中定义的结构体被导入到Delphi 5和C#程序集中。通过COM将delphi 5结构/记录的C风格数组传递给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); 

其转换为一个类型库,并导入到德尔福后的

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

我没想到安全数组与结构的工作,和另一个显然不是一个数组。

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

+0

我想我可以把整个事情看作一个字节[],将其安全地存储到c#中,并对其执行一些不安全的指针。 – Spike

回答

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将它转换回原来的结构。

这有点笨重,但它的工作原理。