0

概要:

.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
4

1 に答える 1

2

メソッドをに渡すためのこのようなデリゲートタイプがあると仮定しますSetCallback

public delegate void CrawlerCallback(string courseName, int subjects, int semesters);

次に、次のNotifyようにこのデリゲートタイプにメソッドをキャストすると、メソッドを渡すことができます。

setCallbackMethod.Invoke(crawlerObj, new object[] { (CrawlerCallback)Notify });
于 2012-06-14T17:12:16.980 に答える