- PR -

VB6.0→.NET移行 構造体の受け渡し

1
投稿者投稿内容
chibana
常連さん
会議室デビュー日: 2005/11/25
投稿数: 32
投稿日時: 2005-11-25 10:08
はじめまして、chibanaといいます。VBとVB.NETは初心者です。
現在、VB6.0→.NET移行作業を担当しており、いろいろ調査中です。

構造体の受け渡しについてですが、アップグレードウィザードの
指摘どおりにマーシャル属性を必ずつけないといけないのでしょうか?
属性をつけないやりかたなどはあるのでしょうか?
また、マーシャル属性はLayoutKind.SequentialとLayoutKind.Explicit
のどちらがいいのでしょうか?

ちなみにプログラムでは構造体をC++のDLLに参照型で受け渡しています。

VB/VB.NETにくわしい皆様方、よろしくおねがいします。



Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-11-25 10:41
引用:

構造体の受け渡しについてですが、アップグレードウィザードの
指摘どおりにマーシャル属性を必ずつけないといけないのでしょうか?
属性をつけないやりかたなどはあるのでしょうか?


必ず付けなければならないわけではありません。一部必須なものもありますが、大半は.NETのマーシャラのデフォルト動作で問題なく相互運用を行ってくれます。
ただ、どれが必須かを(経験的に)知るまでは基本的に付ける方が無難でしょう。

引用:

また、マーシャル属性はLayoutKind.SequentialとLayoutKind.Explicit
のどちらがいいのでしょうか?


ExplicitはFieldOffset属性と併用してフィールドのメモリ配置を強制する属性です。
共用体を使うといった多少特殊な用途でもない限り、Sequentialで十分でしょう。
//FieldOffsetを一々付けるの面倒だし。
なお、.NETの構造体はデフォルトでLayoutKind.Sequentialになっています。StructLayout属性でCharSetなどを設定する必要がない場合、省略できます。
それから、.NETでは構造体のパッキングサイズはデフォルトで8に設定されます。大きさの違う型が混在していたり、固定長配列を使うと言ったときに注意が必要です。StructLayout属性のPackで設定できます。

引用:

ちなみにプログラムでは構造体をC++のDLLに参照型で受け渡しています。


参照型ではなく参照渡しですね?
参照型というとClassのことですから。


アップグレードウィザードには詳しくありませんが、固定長配列・固定長文字列には確かVBFixedArray/VBFixedString属性が付加されたと思います。
マーシャリングにはこれらの属性は使われないことに注意が必要です。
アンマネージドとの相互運用には、MarshalAs属性でUnmanagedType.ByValArray/ByValTStrを指定し、SizeConstでサイズを指定します。
//これらも付けてくれるんでしたっけ?
chibana
常連さん
会議室デビュー日: 2005/11/25
投稿数: 32
投稿日時: 2005-11-25 12:00
chibanaです。Hongliangさん、明解なご教授、真にありがとうございます。
おかげさまで構造体の受け渡しに関してはうまくできそうです。

また、アップグレードウィザードではマーシャル属性付与まではしてくれませんでした。
警告でのお知らせのみです。

お忙しい中、ありがとうございました!!
今後ともよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)