DOBON.NET DOBON.NETプログラミング掲示板過去ログ

構造体の中の構造体配列のマーシャリング

環境/言語:[XP/VB.NET/Framework1.1]
分類:[.NET]

VB6からあるDLLを呼び出していてVB.NETに移行していて、
以下のような構造体の配列のマーシャリングがうまくいきません。
構造体の中の配列の場合はうまくいくのですが、
構造体の中の構造体配列の場合うまくいきません。

<StructLayout(LayoutKind.Sequential)> _
Structure ST2
Dim a As Integer
Dim b As Short
End Structure

<StructLayout(LayoutKind.Sequential)> _
Public Structure ST1
Dim a As Short
Dim b As Short
<VBFixedArray(499), MarshalAs(UnmanagedType.ByValArray, SizeConst:=499)> _
Dim nData() As ST2
Public Sub Initialize()
ReDim nData(499)
End Sub
End Structure

Declare Function cnc_rdmacror Lib "***.dll" (ByVal Hndl As Short, ByRef Odb As ST2) As Short

<エラーメッセージ>
:429 型 ST1 のフィールド nData をマーシャリングできません
: この型は構造体フィールドとして、マーシャリングできません。"


Dim nData() As ST2 がDim nData() As Integerというケースではうまくいくのですが...
MSDNで構造体の中の配列のマーシャリングは解決できたのですが
解決方法教えてもらえませんか?
> 以下のような構造体の配列のマーシャリングがうまくいきません。
> 構造体の中の配列の場合はうまくいくのですが、
> 構造体の中の構造体配列の場合うまくいきません。

こんにちは。

そのような場合は、nDataは一旦IntPtr型で受け取って、
配列として改めてマーシャリングしてやります。
ただし、関数に値を渡すときにはAllocCoTaskMemで確保した
領域を渡してやってください。

DOBON.NET | プログラミング道 | プログラミング掲示板