概要:
.dllを動的にロードし、それらのメソッドを呼び出すアプリケーションを作成しています。
.dllはバックグラウンドで大量のI/Oを実行しているため、「そこで」何が起こっているかをUIに通知するためのコールバックを作成しました。
コードの断片:
dllName = (string) e.Argument;
// Assembling Complete path for the .dll file
completePath = Path.Combine(ConfigurationManager.AppSettings["DllsFolder"], dllName);
Assembly assembler = Assembly.LoadFrom (completePath);
// Creating Instance of Crawler Object (Dynamically)
dllWithoutExtension = Path.GetFileNameWithoutExtension (dllName);
Type crawlerType = assembler.GetType (dllWithoutExtension + ".Crawler");
object crawlerObj = assembler.CreateInstance (crawlerType.FullName);
// Fetching reference to the methods that must be invoked
MethodInfo crawlMethod = crawlerType.GetMethod ("StartCrawling");
MethodInfo setCallbackMethod = crawlerType.GetMethod ("SetCallback");
ここまでは順調ですね。問題は、私が「コールバック」メソッドを宣言したとしても、
public void Notify (string courseName, int subjects, int semesters)
{
string course = courseName;
int a = subjects;
int b = semesters;
}
このコードは機能します(コールバック宣言が機能しているかどうかをテストするためだけに)
Crawler crawler = new Crawler();
crawler.SetCallback (Notify);
crawler.StartCrawling();
これは機能しません(これは私が修正しようとしていることです。.dllメソッドを動的に呼び出し、コールバックを引数として渡します)
setCallbackMethod.Invoke(crawlerObj, new object[] { Notify }); // this method fails, bc its a callback parameter
crawlMethod.Invoke(crawlerObj, new object[] {true} ); // This method works, bc its a bool parameter