- - PR -
VB.NETで構造体の入れ子を行うには
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-10 12:21
下記プログラムの構造体を作成し、CopyMemoryを実行すると
「型 tg1 のフィールド tbl をマーシャリングできません : この型は構造体フィールドとして、マーシャリングできません。」 と表示されて実行出来ません。 tg1内のtblを配列にしなければ実行出来るのですが、配列にすると 実行出来なくなります。 たぶん、マーシャリングの指定方法がおかしいと思うのですが どうにもやり方が分かりません。 どなたか御教授願います。 Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ ByRef Destination As Byte, ByRef Source As tg1, ByVal Length As Long) <StructLayout(LayoutKind.Sequential)> Public Structure tg1 <VBFixedArray(1), MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim tbl() As tg2 Dim buf1 As Integer Dim buf2 As Integer Public Sub Initialize() ReDim tbl(1) End Sub End Structure <StructLayout(LayoutKind.Sequential)> Public Structure tg2 Dim buf1 As Integer Dim buf2 As Integer End Structure Dim buf(1000) As Byte Dim tbl As tg1 tbl.Initialize() Call CopyMemory(buf(0), tbl, 24) | ||||||||
|
投稿日時: 2004-02-10 13:25
MSILはどのようになっていますか? | ||||||||
|
投稿日時: 2004-02-10 13:38
申し訳ありません。 MSILとは何でしょうか? 確認方法はどうすればよろしいのでしょうか。 | ||||||||
|
投稿日時: 2004-02-10 13:44
今後のためにも、せめて、googleでMSILを検索してみるくらいはした方がよろしいのではないかと思われます。 MSILとは・・・ http://www.atmarkit.co.jp/icd/root/63/57773363.html 確認するには・・・ http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cptools/html/cpconmsildisassemblerildasmexe.asp [ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-10 13:46 ] | ||||||||
|
投稿日時: 2004-02-10 13:54
MSILはこんな感じになっています。
[CLS] Module1 | .class private auto ansi sealed | .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) ... |___[VCL] tg1 | | .class value nested public sequential ansi sealed | | extends [mscorlib]System.ValueType | |___[FLD] buf1 : public int32 | |___[FLD] buf2 : public int32 | |___[FLD] tbl : public marshal( fixed array [2]) valuetype test6.Module1/tg2[] | |___[MET] Initialize : void() | |___[VCL] tg2 | | .class value nested public sequential ansi sealed | | extends [mscorlib]System.ValueType | |___[FLD] buf1 : public int32 | |___[FLD] buf2 : public int32 | |___[MET] Initialize : void() | |___[STM] CopyMemory : void(unsigned int8&,valuetype test6.Module1/tg1&,int64) | ||||||||
|
投稿日時: 2004-02-10 14:06
実行コードのこの部分前後のMSILコードを見たいのですが... | ||||||||
|
投稿日時: 2004-02-10 14:26
すみません。これでいいでしょうか。 // コード サイズ 46 (0x2e) .maxstack 3 .locals init ([0] unsigned int8[] buf, [1] valuetype test6.Module1/tg1 tbl) IL_0000: nop IL_0001: ldc.i4 0x3e9 IL_0006: newarr [mscorlib]System.Byte IL_000b: stloc.0 IL_000c: ldloca.s tbl IL_000e: call instance void test6.Module1/tg1::Initialize() IL_0013: nop IL_0014: ldloc.0 IL_0015: ldc.i4.0 IL_0016: ldelema [mscorlib]System.Byte IL_001b: ldloca.s tbl IL_001d: ldc.i8 0x18 IL_0026: call void test6.Module1::CopyMemory(unsigned int8&, valuetype test6.Module1/tg1&, int64) IL_002b: nop IL_002c: nop IL_002d: ret | ||||||||
|
投稿日時: 2004-02-10 15:01
instance void test6.Module1/tg1::Initialize()で生成された配列は test6.Module1/tg1& のように構造体のへの参照と構造体から配列への 2重参照となり、配列の大きさの情報が失われるため配列のマーシャリ ングが不能になると思われます。2重参照にならない方法は... ...ちょっと時間が欲しいですね。 [ メッセージ編集済み 編集者: iStation 編集日時 2004-02-10 15:02 ] |
1|2|3
次のページへ»