我已经尝试过搜索和搜索这个,但也许我正在寻找错误的东西。
我正在制作一种控制面板,我可以在其中添加一些动态加载的 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 "";
}