ご挨拶! 私はC#とそのアセンブリで(少し)騙してきました。ダイナミックローディングアセンブリやそのクラスメンバを呼び出すという面白い機能が見つかりました。 googleのビットとここで私は、いくつかの種類の 'アセンブリエクスプローラ'を書いています。 (私はhere、hereおよびhereからコードの一部を使用していますが、期待した結果はありませんでした)。C# '見つかりませんでした'既存のメソッド
しかし、私は小さなバグを発見しました。私がロードしたアセンブリからクラスメソッドを呼び出そうとしたとき、アプリケーションはMissingMethod例外を発生させました。メインのアプリケーションコードは思わ
:私は、私はロードだDLLは私が(私のアプリは、私だけでなく、レッドゲートの.NETリフレクターを保証します)呼び出すことトラインだクラスやメソッドが含まれていると確信しています大丈夫だと私は私のDLLで間違っていた場合、私は考え始めます...ああ、私は1つのソリューションに両方のプロジェクトを入れましたが、私はそれが問題を引き起こす可能性があるとは思わない。そして、はい、DLLプロジェクトには「クラスライブラリ」のターゲットがあり、メインアプリケーションには「コンソールアプリケーション」のターゲットがあります。
質問:何が問題なのですか?ここで
は、いくつかのソースコードです:
DLLソース:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary1
{
public class Class1
{
public void Main()
{
System.Console.WriteLine("Hello, World!");
}
}
}
メインアプリケーションソース:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFrom(@"a\long\long\path\ClassLibrary1.dll");
try
{
foreach (Type t in asm.GetTypes())
{
if (t.IsClass == true && t.FullName.EndsWith(".Class1"))
{
object obj = Activator.CreateInstance(t);
object res = t.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null); // Exception is risen from here
}
}
}
catch (Exception e)
{
System.Console.WriteLine("Error: {0}", e.Message);
}
System.Console.ReadKey();
}
}
}
UPD:は1ケースのために働いていた - DLLメソッドは引数をとりません:
DLLクラス(メソッドが静的でない場合も動作します):あなたがするために、(Activator.CreateInstance(t)
)インスタンスをcraetingているのはなぜ
object res = t.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, null);
は自分自身をチェックする必要があります:あなたは、オブジェクトの呼び出しを経由して静的メソッドを呼び出すことができますか? –
以下のコメントを見てください。「静的な」引数やその他のものとの違いはありません。 – shybovycha