我已经研究了这一点,无法建立正确的方法。我的问题如下:我有一个winForms应用程序,从内部我希望启动一个时间intesive .dll。我可以使用System.Reflection来做这个没问题,比如这个
// Execute the method from the requested .dll using reflection (System.Reflection).
//[System.Runtime.InteropServices.DllImport(strDllPath)]
DLL = Assembly.LoadFrom(strDllPath);
classType = DLL.GetType(String.Format("{0}.{0}", ListUfCmdParams[1]));
classInst = Activator.CreateInstance(classType);
XmlExpInfo = classType.GetMethod(DllParams[0]);
XmlExpInfo.Invoke(classInst, paramObj);
// Return something.
return String.Format("Method '{0}' from '{1}{2}' successfully executed!",
ListUfCmdParams[2], ListUfCmdParams[1], strDotDll);
这很好但是被调用的过程非常耗时,我想向用户显示正在发生的事情。为此,我在.dll文件中包含了一个WinForm,它有一个progressBar和一些其他属性。当我这样做时,我得到一个例外。当“Activator.CreateInstance()”尝试执行其工作时会发生这种情况:MissingMethodException“无法创建抽象类”。我在使用部分类之前遇到过这个错误,我不得不从我的类中删除“部分”关键字以使.dll能够正确执行(我刚刚离开了!)。我无法从上面的winForms类中删除这个“部分”关键字,所以问题是“如何从我的.dll中调用winForm(如果确实可以的话)?”这样.dll可以在调用应用程序执行时显示其进度吗?
感谢您的时间,
尼克
聚苯乙烯。我已阅读以下主题并且它们有些含糊不清:
A DLL with WinForms that can be launched from A main app
等人
答案 0 :(得分:0)
你不应该让被调用者(dll)知道它的调用者(表单)。相反,您可以使用ProgressUpdated
事件来执行时间密集型方法,从而丰富您的dll中的类:
public event ProgressUpdatedHandler ProgressUpdated;
public delegate void ProgressUpdatedHandler(object sender, int stepsCompleted, int stepsTotal)
这样,表单可以简单地为该事件分配一个处理程序,只要它可以指示事件的进展,dll就可以引发事件。
答案 1 :(得分:0)
我刚刚再次看到这个问题,并认为我会更新我最终如何做到这一点。
最后我发现以下是我想要的最有效的上述方式。首先,您启动一个WinForm,其中包含您的进度信息。第二个youu从“已显示”事件中唤醒你的“工人”方法。
第一部分的代码即使用Reflection调用WinForm,如下所示:
// Execute the method from the requested .dll using reflection (System.Reflection).
Assembly DLL = Assembly.LoadFrom(strDllPath);
Type classType = DLL.GetType(String.Format("{0}.{0}", strNsCn));
object classInst = Activator.CreateInstance(classType, paramObj);
Form dllWinForm = (Form)classInst;
dllWinForm.ShowDialog();
我希望这有助于其他人。