- - PR -
VB6.0→.NET移行 構造体の受け渡し
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-25 10:08
はじめまして、chibanaといいます。VBとVB.NETは初心者です。
現在、VB6.0→.NET移行作業を担当しており、いろいろ調査中です。 構造体の受け渡しについてですが、アップグレードウィザードの 指摘どおりにマーシャル属性を必ずつけないといけないのでしょうか? 属性をつけないやりかたなどはあるのでしょうか? また、マーシャル属性はLayoutKind.SequentialとLayoutKind.Explicit のどちらがいいのでしょうか? ちなみにプログラムでは構造体をC++のDLLに参照型で受け渡しています。 VB/VB.NETにくわしい皆様方、よろしくおねがいします。 | ||||||||||||
|
投稿日時: 2005-11-25 10:41
必ず付けなければならないわけではありません。一部必須なものもありますが、大半は.NETのマーシャラのデフォルト動作で問題なく相互運用を行ってくれます。 ただ、どれが必須かを(経験的に)知るまでは基本的に付ける方が無難でしょう。
ExplicitはFieldOffset属性と併用してフィールドのメモリ配置を強制する属性です。 共用体を使うといった多少特殊な用途でもない限り、Sequentialで十分でしょう。 //FieldOffsetを一々付けるの面倒だし。 なお、.NETの構造体はデフォルトでLayoutKind.Sequentialになっています。StructLayout属性でCharSetなどを設定する必要がない場合、省略できます。 それから、.NETでは構造体のパッキングサイズはデフォルトで8に設定されます。大きさの違う型が混在していたり、固定長配列を使うと言ったときに注意が必要です。StructLayout属性のPackで設定できます。
参照型ではなく参照渡しですね? 参照型というとClassのことですから。 アップグレードウィザードには詳しくありませんが、固定長配列・固定長文字列には確かVBFixedArray/VBFixedString属性が付加されたと思います。 マーシャリングにはこれらの属性は使われないことに注意が必要です。 アンマネージドとの相互運用には、MarshalAs属性でUnmanagedType.ByValArray/ByValTStrを指定し、SizeConstでサイズを指定します。 //これらも付けてくれるんでしたっけ? | ||||||||||||
|
投稿日時: 2005-11-25 12:00
chibanaです。Hongliangさん、明解なご教授、真にありがとうございます。
おかげさまで構造体の受け渡しに関してはうまくできそうです。 また、アップグレードウィザードではマーシャル属性付与まではしてくれませんでした。 警告でのお知らせのみです。 お忙しい中、ありがとうございました!! 今後ともよろしくお願いします。 |
1