2009-07-06 13 views
25

私はこのようなライブラリの読み込みに全く新しいですが、ここに私は立っています:.DLLファイルをロードし、クラス内のメソッドにアクセスしますか?

私は手作りのDLLファイルを手に入れただけで、クラス自体とメソッドについて簡単です。このライブラリをロードするホームプログラムでは、私が持っている:

Assembly testDLL = Assembly.LoadFile("C:\\dll\\test.dll"); 

ここから、私は一種のこだわっています。私が知る限り、名前を変更するとエラーが出るので、正しくロードしています。

ここからは何をしますか?どのくらい正確にクラス&のメソッドをロードするのですか?

ありがとうございました。

+0

このDLLを動的に読み込むためにリフレクションを使用する特別な理由はありますか?そうでない場合は、Lunchyの答えを使用します。 –

答えて

32

すべてのタイプのコレクションを取得するにはAssembly.GetTypes()、特定のタイプを取得する場合はAssembly.GetType(name)を使用してください。

Activator.CreateInstance(type)を使用してパラメータのないコンストラクタを使用して型のインスタンスを作成するか、Type.GetConstructorsを使用してコンストラクタを取得し、インスタンスを作成するために呼び出すことができます。詳細については、member listを見て - あなたはあなたができることの負荷があるタイプを持って一度

同様に、あなたは、

基本的にType.GetMethods()などとメソッドを取得することができます。あなたが特定のタスクを実行しようとしている場合(ジェネリックはやりにくいかもしれません)、特定の質問をするだけで私たちは助けてくれるはずです。

3

動的ににアセンブリをロードし、その中のクラスからメソッドを呼び出す場合は、何らかの形式の動的呼び出しを実行する必要があります。

これについての基本的なアドバイスは、hereを参照してください。

のみビット欠落しているが、簡単にこのようなコードWTH取得できる型自体を、取得する方法である:

foreach (Type t in assemblyToScan.GetTypes()) 
     { 
      if(condition) 
       //do stuff 
     } 

そして、あなたは単にで入手可能なアセンブリを有することにより、(静的にアセンブリを使用する場合コンパイル時)、次にこのページのLauncyの答えが表示されます。

11

タイプを知っている場合、クラスを取得する方法です。

Assembly assembly = Assembly.LoadFrom("C:\\dll\\test.dll"); 

// Load the object 
string fullTypeName = "MyNamespace.YourType"; 

YourType myType = assembly.CreateInstance(fullTypeName); 

フルタイプの名前が重要です。 .dllを追加していないので、あなたのプロジェクトにはないので、使用することはできません。

私がほしいと思えば私はちょうどJon Skeetに答えます。

+1

申し訳ありませんが私はあなたのこの答えを墓から掘る場合。私は同じ方法でインターフェイスにアクセスすることが可能かどうか疑問に思っています。つまり、dllに "MyNamespace.MyInterface"が含まれている場合、どうすれば入手できますか?つまり、あなたの例では、 "YourType"はdllローダーに知られています。そうではないが、私はその名前とそのメソッドを名前で知っている、つまりどこかに文書化されているからだ。 – manu3d

+0

@ manu3dはいできます。同じように動作し、あなたのタイプをインタフェースで置き換えてください。 –

関連する問題