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
カスタムマーシャリングを実装するのが面倒ならば、Public aaa() As tflg
のところをIntegerの配列にするとか。また、tData内部の各フィールドにも
適切なMarshalAs属性を指定するのが無難かと。
しかし、本当のことを言えば連続で配置されることを意味はしないはず。
あくまでも、.NETの外の世界とやりとりする場合にどう配置されるのか、
を決めてるだけですよね。
K.J.Kさん返信ありがとうございます。
カスタムマーシャリングを実装するというのは、
実際どのような宣言になるのか教えて頂けないでしょうか。
宜しくお願いします。
カスタム マーシャリング:
マネージ インターフェイスとアンマネージ インターフェイス間の橋渡しとありますが、説明文章の理解が出来ず、
実装コーディングもよく分かりません。実装方法を教えて下さい。
エリアを連続で取得したいのは、
バイナリファイルから構造体に一気に読込む為です。
VB6から移行が多いので、構造体がVB6と同じように使用したのですが、
そもそもそれに無理があるようでしたら、
適当な方法を教えて下さい。
宜しくお願いします。
いろいろなところで間違った論理展開をしているような。
そもそもバイナリファイルから読み込むのであれば、
FileStreamとBinaryReader
を組み合わせて、そこで適切なコードを書くだけで済みますよね。Marshalling云々は関係がないはずです。自分で「一気に」という
形容詞を付けて要らないことを過剰に考えているだけですよね。
ここで「メモリー上に連続」云々は不要なことがわかりますから、
仮にもし.NET外のDLLを利用してそれとやり取りをする、という
ことが無い限り、後は続かないはずです。
で、もし仮に.NET外のDLLとのやりとりをする、というのであるに
しても、最初書いたように、Integerの配列として渡して、後で
評価しなおせば済むはずでしょう。必ずしもカスタムマーシャリング
までもって行く必要はないはずです。
で、どうしてもカスタムマーシャリングをしたい、というのである
にしても、あの説明ではわからない、というのならば、そもそも
実力も努力も足りていません。出直すことを勧めます。
ツイート | ![]() |