2012-09-14 50 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將它轉換回原來的結構。

這有點笨重,但它的工作原理。