- - PR -
C# DLLが公開している関数の情報を取得する方法
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-02-05 14:02
インポート関数の定義を記述する時に正しいマーキャリング方法を指定する目的で、
前もって必要な情報(関数名、引数の型情報、返値の型情報)を収集したい。 ここで言う「型情報」とは、[MarshalAs(UnmanagedType.XXX)]のXXXを確定するのに必要な情報のことです。 文字列の場合はUnmanagedType.LPStrとUnmanagedType.LPWStrの区別も明確にしたいです。 | ||||||||||||
|
投稿日時: 2008-02-05 14:09
質問の意図と補足します。
対象のDLLに直接問い合わせることで、前述の情報を含む関数のリストを取得することができるでしょうか? ということです。よろしくお願いします。 | ||||||||||||
|
投稿日時: 2008-02-05 14:11
ふーん。がんばって! ・・・じゃないよね。やりたいことはわかったけど何が聞きたいのかな? 文章を見る限り何を調べたかもかかれていない。何を答えたらいいんだろ? ・・・リフレクションでメソッドの情報を得てそこからAttributeの情報も得られたはず。 | ||||||||||||
|
投稿日時: 2008-02-05 14:52
マーシャリングですね。(ただの打ち間違いでしたらすみません)
C#製DLLは.NETのDLLですので、LPStr/LPWStrといった アンマネージな世界のキーワードが使われる場面がありません。 何(開発言語&環境)からC# DLLを扱おうとしているのでしょうか?
.NET Frameworkで動作する言語間の話であれば、 リフレクションを使って情報収集ができます。 Assemblyクラス、Typeクラス、MemberInfoクラスとその継承クラス 辺りを調べればよいと思います。 | ||||||||||||
|
投稿日時: 2008-02-05 15:04
こんにちは。
アンマネージのDLLということですね!? そういったメタ情報を持っていない限り基本的に無理でしょう。 関数名の名前修飾(シンボル名)からある程度の情報は分かりますが… ・stdcall,fastcall呼出規約では、引数のバイト数 ・C++の関数では(オーバーロード機能があるため)、引数の型 (ただしコンパイラベンダによって仕様がまちまち) 参考:名前修飾(Wikipedia) COMであればタイプライブラリ情報があれば、そこから取得できるでしょう。 | ||||||||||||
|
投稿日時: 2008-02-05 15:39
タイトルの「C# DLL」は「C#のDLL」の意味ではなく「C#でDLL」という意味だったのですね。
勘違いしていました。 アンマネージのDLLの情報については私はわかりませんので、 他の方のご回答を参考になさってください。 | ||||||||||||
|
投稿日時: 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 | ||||||||||||
|
投稿日時: 2008-02-05 17:26
こちら↓のサイトもご利用してみてはいかがでしょう。 PINVOKE.NET |