1

これを検索して検索してみましたが、間違ったものを検索しているのかもしれません。

私は動的にロードされるいくつかの DLL を追加できる一種のコントロールパネルを作成しています。DLL をロードするのも実行するのも問題ありません。現在、これを行うために「Activator.CreateInstance」を使用しています。

メソッドは、私がやりたいことを正確に実行しています。

しかし...いくつかのことについて助けが必要です:

1: DLL を実行しているときに、フォームをスレッドで実行しているにもかかわらず、フォームがフリーズします。これを回避するにはどうすればよいですか?

2: ライブで DLL の現在のステータスを読み取ることができる必要があります。DLL ファイルはスーパークラスで作成されているため、「CurrentStatus」プロパティを読み取ることができます。実行中のファイルのこのステータスを読み取ることは可能ですか? プログラムがDLLの終了を待っているため、フリーズしているように思えます。

うまくいけば、あなたの何人かが私を助けることができます.

前もって感謝します :)

編集:いくつかのコードを追加する

                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, curJob.Scheduler_JobAssemblyName + ".dll");
                Assembly assembly = Assembly.LoadFile(path);

                GenericSchedulerJob o = (GenericSchedulerJob)Activator.CreateInstance(Type.GetType(curJob.Scheduler_JobAssemblyName + "." + curJob.Scheduler_JobAssemblyName + ", " + curJob.Scheduler_JobAssemblyName, true));
                Thread thread = new Thread(() => ExecuteDLL(ref o, "RunJob", row));
                thread.Start();
                while (!o.JobFinished)
                {
                    // Do something (update status, etc.)
                }


    private string ExecuteDLL(ref GenericSchedulerJob job, string methodName, DataGridViewRow row)
    {
        string returnVal;
        if (job != null)
        {
            // Get method
            MethodInfo mi = job.GetType().GetMethod(methodName); // Get method info
            if (mi != null)
            {
                // Let's start ...
                returnVal = (string)mi.Invoke(job, null); // Execute method with parameters
            // job is the SuperClass, where I can read the status from
            }
            else
            {
                returnVal = "Method <" + methodName + "> not found in class."; // Error .. 
            }
        }
        else
        {
            returnVal = "Class not found in external plugin."; // Error .. 
        }

        return "";
    }
4

1 に答える 1