これを検索して検索してみましたが、間違ったものを検索しているのかもしれません。
私は動的にロードされるいくつかの 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 "";
}