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側では、COMを介してC#アセンブリに渡したい構造体のCスタイルの配列へのポインタがあります。理想的には、これをmyStruct []としてc#側で終了させたいのですが、構造体はすべてブリット可能であるため、適切にマーシャリングされたメモリブロックへのポインタを使用します。

私が試した2つの方法は

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 からの構造体を 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);

次に、このソリューションを使用して元の構造体に変換しました。

それは少し不格好ですが、うまくいきます。

于 2012-09-18T03:31:20.870 に答える