構造体のMarshalAs属性宣言について


キムチ  2005-09-08 20:09:57  No: 92127

DLLへの構造体データ引渡しや、メモリコピーをしたいのですが、
MarshalAs属性の使い方の誤りか、不可能なことなのか・・?
うまくいきません。
MarshalAsでタイプやサイズを指定する宣言と、
オフセットで位置指定する宣言(下記)を試しました。
下記のような構造体をメモリ上連続にとるのは、
どうしたらいいか教えて下さい。

    <StructLayout(LayoutKind.Sequential)> _
    Public Structure tflg
        Public labc As Integer
        Public lbcd As Integer
        Public lcde As Integer
    End Structure

    <StructLayout(LayoutKind.Explicit, Size:=448)> _
    Public Structure tData
        <FieldOffset(4 * 0)> Public aaa() As tflg
        <FieldOffset(4 * 9)> Public bbb As Single
        <FieldOffset(4 * 10)> Public ccc() As Single
        <FieldOffset(4 * 110)> Public ddd As Single
        <FieldOffset(4 * 111)> Public eee As Single

        Public Sub initialize()
            ReDim aaa(2)
            ReDim ccc(100)
        End Sub
    End Structure


K.J.K.  2005-09-08 21:06:50  No: 92128

カスタムマーシャリングを実装するのが面倒ならば、Public aaa() As tflg
のところをIntegerの配列にするとか。また、tData内部の各フィールドにも
適切なMarshalAs属性を指定するのが無難かと。

しかし、本当のことを言えば連続で配置されることを意味はしないはず。
あくまでも、.NETの外の世界とやりとりする場合にどう配置されるのか、
を決めてるだけですよね。


キムチ  2005-09-08 22:08:38  No: 92129

K.J.Kさん返信ありがとうございます。
カスタムマーシャリングを実装するというのは、
実際どのような宣言になるのか教えて頂けないでしょうか。
宜しくお願いします。


K.J.K.  2005-09-09 03:42:56  No: 92130

http://www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconimplementingicustommarshalerinterface.asp


キムチ  2005-09-09 22:54:38  No: 92131

カスタム マーシャリング:
マネージ インターフェイスとアンマネージ インターフェイス間の橋渡しとありますが、説明文章の理解が出来ず、
実装コーディングもよく分かりません。実装方法を教えて下さい。

エリアを連続で取得したいのは、
バイナリファイルから構造体に一気に読込む為です。
VB6から移行が多いので、構造体がVB6と同じように使用したのですが、
そもそもそれに無理があるようでしたら、
適当な方法を教えて下さい。
宜しくお願いします。


K.J.K.  2005-09-10 03:55:36  No: 92132

いろいろなところで間違った論理展開をしているような。

そもそもバイナリファイルから読み込むのであれば、
 FileStreamとBinaryReader
を組み合わせて、そこで適切なコードを書くだけで済みますよね。Marshalling云々は関係がないはずです。自分で「一気に」という
形容詞を付けて要らないことを過剰に考えているだけですよね。

ここで「メモリー上に連続」云々は不要なことがわかりますから、
仮にもし.NET外のDLLを利用してそれとやり取りをする、という
ことが無い限り、後は続かないはずです。

で、もし仮に.NET外のDLLとのやりとりをする、というのであるに
しても、最初書いたように、Integerの配列として渡して、後で
評価しなおせば済むはずでしょう。必ずしもカスタムマーシャリング
までもって行く必要はないはずです。

で、どうしてもカスタムマーシャリングをしたい、というのである
にしても、あの説明ではわからない、というのならば、そもそも
実力も努力も足りていません。出直すことを勧めます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加