- PR -

C# DLLが公開している関数の情報を取得する方法

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2008-02-05 14:02
 インポート関数の定義を記述する時に正しいマーキャリング方法を指定する目的で、
前もって必要な情報(関数名、引数の型情報、返値の型情報)を収集したい。
 ここで言う「型情報」とは、[MarshalAs(UnmanagedType.XXX)]のXXXを確定するのに必要な情報のことです。
 文字列の場合はUnmanagedType.LPStrとUnmanagedType.LPWStrの区別も明確にしたいです。

 
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2008-02-05 14:09
質問の意図と補足します。

対象のDLLに直接問い合わせることで、前述の情報を含む関数のリストを取得することができるでしょうか?

ということです。よろしくお願いします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2008-02-05 14:11
引用:

ひろしさんの書き込み (2008-02-05 14:02) より:
 インポート関数の定義を記述する時に正しいマーキャリング方法を指定する目的で、
前もって必要な情報(関数名、引数の型情報、返値の型情報)を収集したい。
 ここで言う「型情報」とは、[MarshalAs(UnmanagedType.XXX)]のXXXを確定するのに必要な情報のことです。
 文字列の場合はUnmanagedType.LPStrとUnmanagedType.LPWStrの区別も明確にしたいです。

 



ふーん。がんばって!

・・・じゃないよね。やりたいことはわかったけど何が聞きたいのかな?
文章を見る限り何を調べたかもかかれていない。何を答えたらいいんだろ?
・・・リフレクションでメソッドの情報を得てそこからAttributeの情報も得られたはず。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-02-05 14:52
引用:

ひろしさんの書き込み (2008-02-05 14:02) より:
 インポート関数の定義を記述する時に正しいマーキャリング方法を指定する目的で、



マーシャリングですね。(ただの打ち間違いでしたらすみません)

引用:

前もって必要な情報(関数名、引数の型情報、返値の型情報)を収集したい。
 ここで言う「型情報」とは、[MarshalAs(UnmanagedType.XXX)]のXXXを確定するのに必要な情報のことです。
 文字列の場合はUnmanagedType.LPStrとUnmanagedType.LPWStrの区別も明確にしたいです。



C#製DLLは.NETのDLLですので、LPStr/LPWStrといった
アンマネージな世界のキーワードが使われる場面がありません。

何(開発言語&環境)からC# DLLを扱おうとしているのでしょうか?
 
引用:

対象のDLLに直接問い合わせることで、前述の情報を含む関数のリストを取得することができるでしょうか?



.NET Frameworkで動作する言語間の話であれば、
リフレクションを使って情報収集ができます。
Assemblyクラス、Typeクラス、MemberInfoクラスとその継承クラス
辺りを調べればよいと思います。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-02-05 15:04
こんにちは。

引用:

ひろしさんの書き込み (2008-02-05 14:09) より:

対象のDLLに直接問い合わせることで、前述の情報を含む関数のリストを取得することができるでしょうか?
ということです。よろしくお願いします。



アンマネージのDLLということですね!?
そういったメタ情報を持っていない限り基本的に無理でしょう。

関数名の名前修飾(シンボル名)からある程度の情報は分かりますが…
・stdcall,fastcall呼出規約では、引数のバイト数
・C++の関数では(オーバーロード機能があるため)、引数の型 (ただしコンパイラベンダによって仕様がまちまち)

参考:名前修飾(Wikipedia)

COMであればタイプライブラリ情報があれば、そこから取得できるでしょう。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-02-05 15:39
タイトルの「C# DLL」は「C#のDLL」の意味ではなく「C#でDLL」という意味だったのですね。
勘違いしていました。
アンマネージのDLLの情報については私はわかりませんので、
他の方のご回答を参考になさってください。

ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2008-02-05 17:20
ご回答ありがとうございます。

COMでは無いアンマネージなDLLをC#から呼び出す操作を前提に質問していました。
言葉足らずの質問で混乱させてしまいすみませんでした。

型情報の仕様はがDLLが作成されたコンパイラに依存するということは、
場合によっては、公開されている型情報の自動変換に失敗する危険性がある
という理解で正しいのでしょうか?
そうであるなら、自動変換などあてにせず、
今後はマーシャリング方法を明示的に指定するよう改めようと考えています。

 また、対象のDLLがWin32APIのDLL(Kernel32.Dll等)場合は、引数情報をMSDN等で明確にした上で、下表でC#側の型を決定し、明示的にマーシャリング方法を指定しようと考えています。

http://msdn2.microsoft.com/en-us/library/aa720411(VS.71).aspx
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-02-05 17:26
引用:

ひろしさんの書き込み (2008-02-05 17:20) より:
 また、対象のDLLがWin32APIのDLL(Kernel32.Dll等)場合は、引数情報をMSDN等で明確にした上で、下表でC#側の型を決定し、明示的にマーシャリング方法を指定しようと考えています。
http://msdn2.microsoft.com/en-us/library/aa720411(VS.71).aspx



こちら↓のサイトもご利用してみてはいかがでしょう。
PINVOKE.NET

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