C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 構造体の中に固定長の構造体配列宣言


(過去ログ 84 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■49807 / inTopicNo.1)  構造体の中に固定長の構造体配列宣言
  
□投稿者/ ホエホエ (8回)-(2010/05/18(Tue) 11:52:25)

分類:[C#] 

いつも助けていただいてるホエホエです。
検索でいろいろ調べたんですが、どうしても
分からず投稿させていただきました。

タイトルにもある通り、DLLのAPIとの受渡に
構造体の中にネストして固定長の構造体配列を
宣言したいのですが開発環境が.NET1.1のため、
『fixed』が使用できずマーシャリングでどうにか
しようとしてますがどうしても上手くいきません。

宣言(例)
[StructLayout(LayoutKind.Sequential,Pack=1)]
public struct Info
{
public ushort wA;
public ushort wB;
public uint nC;
public double dD;
};

[StructLayout(LayoutKind.Sequential,Pack=1)]
public struct Data
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Info[] InfoData;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 520)]
public ushort[] DataA;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 520)]
public ushort[] DataB;
};

とすると下記例外が発生
『'System.ArgumentException' のハンドルされていない例外が
Test.exe で発生しました。

追加情報 : 型 Test.Data はアンマネージ構造体として集成できません。
有効なサイズ、またはオフセットの計算ができません。』

どうか良い方法を教えてください、お願いします。
引用返信 編集キー/
■49809 / inTopicNo.2)  Re[1]: 構造体の中に固定長の構造体配列宣言
□投稿者/ Hongliang (628回)-(2010/05/18(Tue) 12:52:48)
.NET Framework 1.x の範囲では、固定長構造体配列を持った構造体はマーシャリングできなかったはずです。
// 私自身は既に忘れているので参考リンク。
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-20514.htm
2.0 以降では有効な記述なのですが(fixed はめんどくさいので、むしろ ByValArray を使うことの方が多い)。

8 つ程度なら、普通にメンバとして並べるだけと言う手もあります。public Info InfoData1, InfoData2, ...; みたいに。
引用返信 編集キー/
■49812 / inTopicNo.3)  Re[2]: 構造体の中に固定長の構造体配列宣言
□投稿者/ ホエホエ (9回)-(2010/05/18(Tue) 13:17:10)
Hongliang さんご返信ありがとうございます。

やはり.NET 1.x + マーシャリングではダメなようですねぇ。
ちょっとC宣言調に記載できないのは悔しいですが、
仕方ないのでInfoData1〜InfoData8と言う記載で
逃げようかと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -