C#加载组件和实时更新表单
我试着搜索这个,但也许我搜索错了 我正在制作一种控制面板,在那里我可以添加一些动态加载的DLL。 加载DLL对我来说没有问题,让它运行也没有问题——目前我正在使用“Activator.CreateInstance”来完成这项工作 这个方法正是我想要它做的 但是。。。我需要一些帮助来完成以下几件事: 1:当我执行DLL时,表单是冻结的,即使我在线程中运行它-我如何避免这种情况 2:我需要能够读取动态链接库的当前状态,实时-动态链接库文件是用超类创建的,因此我可以读取“当前状态”属性。 是否可以读取正在运行的文件的此状态? 在我看来,程序正在等待DLL完成,这使它冻结 希望你们中的一些人能帮助我 提前感谢:) 编辑:添加一些代码C#加载组件和实时更新表单,c#,dll,.net-assembly,dynamic-loading,createinstance,C#,Dll,.net Assembly,Dynamic Loading,Createinstance,我试着搜索这个,但也许我搜索错了 我正在制作一种控制面板,在那里我可以添加一些动态加载的DLL。 加载DLL对我来说没有问题,让它运行也没有问题——目前我正在使用“Activator.CreateInstance”来完成这项工作 这个方法正是我想要它做的 但是。。。我需要一些帮助来完成以下几件事: 1:当我执行DLL时,表单是冻结的,即使我在线程中运行它-我如何避免这种情况 2:我需要能够读取动态链接库的当前状态,实时-动态链接库文件是用超类创建的,因此我可以读取“当前状态”属性。 是否可以读取
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 "";
}
string path=path.Combine(AppDomain.CurrentDomain.BaseDirectory,curJob.Scheduler\u jobsassemblyName+“.dll”);
Assembly=Assembly.LoadFile(路径);
GenericSchedulerJob o=(GenericSchedulerJob)Activator.CreateInstance(Type.GetType(curJob.Scheduler\u JobAssemblyName+“+curJob.Scheduler\u JobAssemblyName+”,“+curJob.Scheduler\u JobAssemblyName,true));
线程线程=新线程(()=>executell(参考o,“RunJob”,行));
thread.Start();
而(!o.JobFinished)
{
//做点什么(更新状态等)
}
私有字符串ExecuteDLL(参考GenericSchedulerJob、字符串方法名、DataGridViewRow行)
{
字符串returnVal;
如果(作业!=null)
{
//获取方法
MethodInfo mi=job.GetType().GetMethod(methodName);//获取方法信息
如果(mi!=null)
{
//让我们开始。。。
returnVal=(string)mi.Invoke(job,null);//使用参数执行方法
//job是超类,我可以从中读取状态
}
其他的
{
returnVal=“在类中找不到方法。”;//错误。。
}
}
其他的
{
returnVal=“在外部插件中找不到类。”;//错误。。
}
返回“”;
}
表单正在暂停,因为此代码
while (!o.JobFinished)
{
// Do something (update status, etc.)
}
正在强制它等待,即使实际的dll代码正在另一个线程上运行
你需要让这个方法完成。(或者我想你可以使用Application.DoEvents()
,如果它不会在你嘴里留下不好的味道的话
要获取状态信息,您应该使用一个事件,您可以在创建dll后连接该事件。这样,当dll更改其状态时,您的应用程序可以得到通知
或者,您可以使用第二个计时器并轮询每个正在运行的作业的状态,但事件会更好。由于此代码,表单正在暂停
while (!o.JobFinished)
{
// Do something (update status, etc.)
}
正在强制它等待,即使实际的dll代码正在另一个线程上运行
你需要让这个方法完成。(或者我想你可以使用Application.DoEvents()
,如果它不会给你留下不好的印象的话。)
要获取状态信息,您应该使用一个事件,您可以在创建dll后连接该事件。这样,当dll更改其状态时,您的应用程序可以得到通知
或者,您可以使用第二个计时器并轮询每个正在运行的作业的状态,但事件会更好。抱歉,我的水晶球正在进行修复,您需要显示一些代码。完成后,第一段代码在计时器中,因为它是一个使用特定间隔运行的计划程序。我的水晶球正在进行修复,您将需要显示一些代码。完成后,第一段代码在一个计时器中,因为它是一个以特定间隔运行的计划程序。我让它在DLL中处理事件,所以这是一个完美的答案!我添加了一个额外的事件,告诉DLL是否已完成运行,并且正在“父级”中处理此事件。非常感谢!)@Oxholm,没问题。很高兴我能帮上忙,我让它处理DLL中的事件,所以这是一个完美的答案!我添加了一个额外的事件,告诉它DLL是否已完成运行,并且正在“父级”中处理。非常感谢!:)@Oxholm,没问题。很高兴我能帮忙