如何从运行时启动的.dll中启动Windows窗体

时间:2011-06-21 10:03:09

标签: c# windows winforms dll runtime

我已经研究了这一点,无法建立正确的方法。我的问题如下:我有一个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

等人

2 个答案:

答案 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();

我希望这有助于其他人。