【C#】構造体のマーシャリングについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aridai1221
記事: 16
登録日時: 9年前

【C#】構造体のマーシャリングについて

#1

投稿記事 by aridai1221 » 9年前

C#からC++の関数をDllImportを行い、呼び出したいと思っています。

横幅 (width) と 高さ (height) を持つ構造体を戻り値として返す関数ですが、
C#側では構造体のマーシャリングを行い、
System.Drawing.SizeF構造体の形で受け取りたいと思っています。

C#ではこのようなコードになることを期待しています。

コード:

static class Hoge
{
    [DllImport("hoge.dll")]
    public static extern System.Drawing.SizeF getSize();
}
C++の関数の方では
なんという型 (構造体) を返すような設計にすればよいのでしょうか。

こちら
C# に構造体が用意されている場合もある
によると Win32API の RECT構造体 は .NET Framework の System.Drawing.Rectangle構造体 として扱うことができる (マーシャリングされる) らしいのですが、
System.Drawing.SizeF構造体とマーシャリングされるようなWin32APIの構造体はあるのでしょうか。

また、C++の型とC#の型がマーシャリング可能かどうかを調べる術を教えて下さい。
(マイクロソフトのリファレンスなどに書いてあるのでしょうか?)

もしWin32API側で対応している型などが無いのであれば
C#の方で自分で構造体を定義することにします。

ちなみに、Direct2DのD2D1_SIZE_F型か、もしくは
そのメンバ
・float width
・float height
を含む他の型のオブジェクトを生成し、
それを返すようなコードをC++側で書き、
C#側でSystem.Drawing.SizeF型として扱いたいという状況です。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: 【C#】構造体のマーシャリングについて

#2

投稿記事 by YuO » 9年前

.NETの値型とWin32の構造体間でマーシャリングされる物が決まっているわけでは無く,
単純に同一のメモリ配置(になるように.NET側で定義されている)のものが,同じように扱える,というだけです。

SizeF構造体はwidth, heightの順でfloatのフィールドが定義されているので,この順序に合うWin32の構造体はすべてマーシャリングに使えます。
極端な話,サイズが合うのでPOINT構造体とのマーシャリングを行わせることも一応出来ます。


個人的には,APIを提供するC++側に合わせてC#側でstructを用意した方が使い勝手がよいと思います (結果的に既存の型であっても)。
また,Direct2Dと関係ないのにDirect2Dの型を,既存で同一の要素からなる型があるから使う,というのは悪手に見えます。

aridai1221
記事: 16
登録日時: 9年前

Re: 【C#】構造体のマーシャリングについて

#3

投稿記事 by aridai1221 » 9年前

自分で構造体を定義することにしました。
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る