C#加载组件和实时更新表单

C#加载组件和实时更新表单,c#,dll,.net-assembly,dynamic-loading,createinstance,C#,Dll,.net Assembly,Dynamic Loading,Createinstance,我试着搜索这个,但也许我搜索错了 我正在制作一种控制面板,在那里我可以添加一些动态加载的DLL。 加载DLL对我来说没有问题,让它运行也没有问题——目前我正在使用“Activator.CreateInstance”来完成这项工作 这个方法正是我想要它做的 但是。。。我需要一些帮助来完成以下几件事: 1:当我执行DLL时,表单是冻结的,即使我在线程中运行它-我如何避免这种情况 2:我需要能够读取动态链接库的当前状态,实时-动态链接库文件是用超类创建的,因此我可以读取“当前状态”属性。 是否可以读取

我试着搜索这个,但也许我搜索错了

我正在制作一种控制面板,在那里我可以添加一些动态加载的DLL。 加载DLL对我来说没有问题,让它运行也没有问题——目前我正在使用“Activator.CreateInstance”来完成这项工作

这个方法正是我想要它做的

但是。。。我需要一些帮助来完成以下几件事:

1:当我执行DLL时,表单是冻结的,即使我在线程中运行它-我如何避免这种情况

2:我需要能够读取动态链接库的当前状态,实时-动态链接库文件是用超类创建的,因此我可以读取“当前状态”属性。 是否可以读取正在运行的文件的此状态? 在我看来,程序正在等待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 "";
    }
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,没问题。很高兴我能帮忙