DOBON.NET DOBON.NETプログラミング掲示板過去ログ

dllの使い方

環境/言語:[C#]
分類:[.NET]

dllについて質問です。

デベロッパーのみなさんはよくラッパーなどを作ってdllを公開されてると思うのですが、そのdllってどうやって使えばいいんでしょうか?

dumpbinでエクスポートしている関数と関数名からだいたい何をする関数なのかは見当がつくのですが引数に何をとるかまではわかりませんよね。

dllのマニュアルとかまったく書いていなくてdllとソースが置いてあるということは使い方はそのソースをみてね?という意味でいいんでしょうか。

それともソースを見なくてもいい別の方法があるんでしょうか。

ご教示いただけると幸いです。
ラッパーだったら,もともとのAPIの解説を見れば引数の意味はわかると思います。
引数の型はIDEが教えてくれると思います。
元のAPIの引数の型と,ラッパーDLLの引数の型が違うときに悩みますが,だいたい法則性があるので,よく考えれば何とかなります。
RASさん回答ありがとうございます。

たしかにラッパーの場合は参考にできるドキュメントがあるので
何となく見当がつきそうですね。

IDEが教えてくれるんですか!?
たとえば、kernel32.dll,visual studio 2010,C#の場合でbeepを使うとすると、

ここまではかけますよね。
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private extern static bool Beep(

でも、このあとの引数が何をとるのか、いくつとるのか悩みます。
たとえば、vsの場合このあとの引数の候補はでてきません。

eclipse, BorlandIDE等ではこの部分の補完機能が備わってるという解釈ですか?

もし、トンチンカンな理解をしていたら申し訳ありません。
ご教示いただければと思います。
■No28541に返信(ろーずさんの記事)

> たとえば、kernel32.dll,visual studio 2010,C#の場合でbeepを使うとすると、
>
> ここまではかけますよね。
> [System.Runtime.InteropServices.DllImport("kernel32.dll")]
> private extern static bool Beep(
この形式で書くというのは.Net用にラッピングされているとは言えないので、そういうことではないと思います。ラッピングされていれば参照してクラスとして呼べるということだと思います。
  • 題名: Re[4]: dllの使い方
  • 著者: YAS
  • 日時: 2011/05/07 11:21:08
  • ID: 28543
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
>[System.Runtime.InteropServices.DllImport("kernel32.dll")]
>private extern static bool Beep(

これはWin32APIの呼び出しですね。
私が書いたのは,このようなAPIをラッピングしてC#から参照設定できるようにしたDLLのことです。

Win32APIのようなネイティブコードを呼び出すには,APIの引数の型を参考に
DllImportの引数は自分で考える必要があります。

そのようなプラットフォーム呼び出し(P/Invoke)の宣言のデータベースサイトも
ありますので,それを利用するのが簡単です。

http://pinvoke.net/
  • 題名: Re[1]: dllの使い方
  • 著者: Azulean
  • 日時: 2011/05/07 18:58:03
  • ID: 28544
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2011/05/07(Sat) 18:59:55 編集(投稿者)

■No28539に返信(ろーずさんの記事)
> デベロッパーのみなさんはよくラッパーなどを作ってdllを公開されてると思うのですが、そのdllってどうやって使えばいいんでしょうか?

すでに指摘されていますが、「ラッパー」は何をラップしたものかを定義しておくべきでしたね。
.NET 界隈でラッパーと言われると、ネイティブ資産を .NET から使えるようにラップしたクラス、あるいはアセンブリを思い浮かべることが多いと思います。
(それに限りませんが)


> dumpbinでエクスポートしている関数と関数名からだいたい何をする関数なのかは見当がつくのですが引数に何をとるかまではわかりませんよね。

これは、その関数がどういった引数を取るか、どういった戻り値を返すかという情報を別途、ヘッダーファイルなり、リファレンスなりで確認しないといけません。
逆に言えば、dumpbin のエクスポート関数一覧だけでは、わかりません。


> dllのマニュアルとかまったく書いていなくてdllとソースが置いてあるということは使い方はそのソースをみてね?という意味でいいんでしょうか。

この「ソース」って何でしょう?
サンプルであれば、そのサンプルの中に関数のプロトタイプ宣言がないですかね。


> それともソースを見なくてもいい別の方法があるんでしょうか。

DLL のバイナリとサンプルソースしかないなら、サンプルソースを見るしかないんじゃないでしょうか。


Win32API の P/Invoke の場合は、すでに書かれた宣言を探してくるか、自分で Windows SDK(MSDN のライブラリサイトを含む)に書かれている宣言を元に、P/Invoke 用に書き直すということが必要でしょう。

DOBON.NET | プログラミング道 | プログラミング掲示板