web-dev-qa-db-ja.com

内のクラスから.DLLファイルをロードしてメソッドにアクセスしますか?

私はこのようなライブラリをロードするのはまったく新しいですが、ここに私が立っています:

自家製のDLLファイルは、クラス自体とメソッドと同じくらい簡単です。このライブラリをロードするホームプログラムには、次のようなものがあります。

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

ここからは、ちょっと行き詰まっています。私の知る限り、名前を変更するとエラーが発生するため、正しくロードされます。

ここから何をしますか?その中にクラスとメソッドをどのように正確にロードしますか?

ありがとう。

26
scrot

すべての型のコレクションを取得するにはAssembly.GetTypes()を使用し、特定の型を取得するにはAssembly.GetType(name)を使用します。

次に、Activator.CreateInstance(type)を使用してパラメーターなしのコンストラクターで型のインスタンスを作成するか、_Type.GetConstructors_を使用してコンストラクターを取得し、それらを呼び出してインスタンスを作成できます。

同様に、Type.GetMethods()などを使用してメソッドを取得できます。

基本的に、型を取得すると、実行できることがたくさんあります。詳細については、 member list を参照してください。特定のタスクを実行しようとしてスタックする場合(ジェネリックは扱いにくい場合があります)、特定の質問をするだけで、私たちがお手伝いできると確信しています。

33
Jon Skeet

これは、タイプがわかっている場合にクラスを取得する方法です。

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

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

YourType myType = Assembly.CreateInstance(fullTypeName);

完全なタイプ名は重要です。 .dllを追加していないので、プロジェクトにないので使用できません。

あなたがすべてを望んでいるなら、私はジョン・スキートが答えるでしょう。

12
David Basarab

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

基本的なアドバイスについては here を確認してください。

不足しているのは、型自体を取得する方法だけです。これは、次のようなコードで簡単に取得できます。

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

また、アセンブリを静的に(コンパイル時にアセンブリを使用できるようにすることで)単に使用したい場合は、このページのLauncyからの答えが最適です。

3
Kenan E. K.