web-dev-qa-db-ja.com

Visual Studio 2010 ExpressでDLLからC#ラッパークラスを自動的に生成しますか?

私の同僚から、Visual Studioでは.dllおよび自動でC#ラッパークラスを自動生成します。これは本当に可能ですか?もしそうなら、これを達成するにはどうすればよいですか?私はウェブを閲覧しましたが、何も思い付きませんでした!

皆さんありがとう!


これらのリソースも共有したいと思いました。

25
mre

3つのケース:

  1. DLLはマネージアセンブリを表します=>プロジェクトで直接参照して使用します
  2. DLLはCOMオブジェクトを表します=> tlbimp.exe ユーティリティを使用してマネージラッパーを生成できます
  3. DLLは、いくつかのエクスポートされた関数を含むアンマネージライブラリを表します。これは最も難しいものです。ツールはありません。ライブラリのドキュメントを参照して、エクスポートされた関数の名前とパラメータを確認し、ビルドする必要があります。管理されたP/Invokeラッパー。 dumpbin.exe ユーティリティを使用して、エクスポートされた関数のリストを表示できます。MSDNのさまざまな手順に関する 記事 をご覧ください。
34
Darin Dimitrov

これは確かにどのDLLでも不可能です。 COMサーバーを実装する非常に特殊な種類です。コンバーターは、エクスポートされた型の適切な説明を必要とします。これは、そのようなサーバーにtype libraryによって提供されます。

タイプライブラリは、マネージアセンブリのメタデータとまったく同じです。スタンドアロンファイル(.tlbファイル)として開始されますが、DLLのリソースとして埋め込まれることがよくあります。それのための良い場所は、それを実装するコードの近くに型の説明を保ちます。 .NETアセンブリのメタデータと同じです。

タイプライブラリを表示するために操作するいくつかのツール(Expressで機能するかどうかは不明):Visual Studioでは、ファイル+オープン+ファイルを使用して、たとえばc:\ windows\system32\Shell32.dllを選択します。そのDLLにリソースが表示されます。TYPELIBノードに注意してください。それがタイプライブラリです。バイナリなので、実際に読むのは現実的ではありません。そのためには、Visual StudioコマンドプロンプトからOleView.exeを実行します。ファイル+ Typelibを表示し、同じDLLを選択します。これにより、タイプライブラリが逆コンパイルされ、タイプライブラリの作成に最初に使用されたインターフェイス記述言語であるIDLに戻ります。読みやすく、言語の理解にほとんど問題がありません。また、.NET Tlbimp.exeがそのタイプライブラリを同等のC#宣言に変換する方法を簡単に確認できます。

タイプライブラリは古く、1996年以来存在しています。元々はMicrosoftのVisual BasicチームによってVBXの代わりとして16ビットVB拡張性モデルとして設計されました。それらは- very成功、ほとんどすべてのWindowsコンパイラがそれらをサポートします。ただし、表現力に制限があり、ジェネリックや実装の継承などのサポートはありません。注目すべきは、Windows 8チームがWinRTのタイプライブラリを置き換えたことです。 .NETメタデータ形式を選びました。

7
Hans Passant

この質問はかなり古く、十分に回答されているようですが、重要だと思う考えを1つ追加したいと思います。私は完全に間違っている可能性があるので、私の答えを一粒の塩で取り、私がそうである場合はこれを修正してください。

DLLのメンバー/フィールドを呼び出すことができるようにするには、それらを呼び出すために必要な情報に何らかの形でアクセスできる必要があります。その情報は、ラッパーを作成するために必要なすべてです。これにより、すべてのメンバー/フィールド「メソッド」、つまりメソッドヘッダーなどを決定できます。

C#では、リフレクションを介してDLLをロードし、その情報を取得することが可能です。上で説明したように、さまざまなDLLタイプについては知りませんが、メンバー/フィールドを呼び出すには、この情報が何らかの形式で存在している必要があります。したがって、リフレクションを使用してその情報を取得すると、新しいクラスを生成できます。 "prefixOriginalname"を使用して、元のクラスと同じメンバー/フィールドを持ち、元のクラスのメンバー/フィールドを呼び出して、必要な追加機能を追加します。

そう

  1. すべてのDLL(または周辺文書)は、そのタイプを使用するために必要な情報を提供します。つまり、「パブリック」として実装されるすべてのもの
  2. リフレクションを介してこの必要な情報にアクセスできます
  3. 1.と2.を指定すると、DLLから必要な情報を抽出し、それに応じてラッパーを生成するプログラムを作成できます。

私が言ったように、私はこれについて100%確信していません、なぜなら他の答えはそれがそれが何かのために難しすぎるか不可能でさえあるかもしれないように私に聞こえるようにするからです。

0