在COM可见DLL终止后保持表单运行

时间:2012-07-20 16:12:09

标签: c# .net com

我在C#中创建了一个COM Visible DLL,它应该在主机应用程序中用户的一些输入(非托管)之后显示一个Form。它适用于ShowDialog(),但理想情况下,即使在DLL完成后,Form也应继续运行。由于表单需要一些数据,因此不能选择具有Main(string[] args)的单独项目。

我怎样才能做到这一点?我尝试了类似的东西,但没有用。

public class FormManager : ApplicationContext
{
    FormMain frmMain;


    public FormManager()
        :base(new FormMain())
    {
        frmMain = (FormMain)this.MainForm;
        frmMain.Closed += new EventHandler(OnFormClosed);
    }

    public void SetData(object o1, object o2)
    {
        if (frmMain != null)
        {
            frmMain.SetData(o1, o2);
            frmMain.Show();
        }
    }

    private void OnFormClosed(object sender, EventArgs e)
    {
            ExitThread();
    }
}

我不知道应该在哪里插入Application.Run

1 个答案:

答案 0 :(得分:2)

我也有点不清楚你在这里尝试做什么 ...但通常情况下,如果你将Application.Run置于该代码的某处,那么将取代这一行:

frmMain.Show();

当然,通过使用Application.Run,您将冻结此代码(调用Application.Run的线程),直到相关表单关闭...所以也许这并不能真正实现您想要的(它确实不清楚。)

<小时/> 澄清问题后编辑
以下是关于.NET中COM的事情,这与以前的Microsoft语言迭代不同。当您通过COM(OLE)在.NET中调用程序集时,调用程序集将COM公开的代码包含在其运行时中。换句话说,当您查看任务管理器时,您将看不到两个程序集都在运行!你只能看到那个做这个电话的人。因此,当您关闭主程序集时,将关闭附加到其上的所有正在运行的代码,包括COM代码。

有一种解决方法,但并不简单。简而言之,您需要:

  1. 启动第二个流程(例如,您可以使用Process.Start())
  2. 使用第一个进程查看ROT(运行对象表)并找到第二个程序集
  3. 通过COM(OLE)自由沟通并传递您的数据
  4. 此时,两个程序集在不同的运行时中运行,允许您在第二个程序集中生成在第一个程序集关闭时不会关闭的表单。据我所知,这就是你在寻找的东西。

    如果您想尝试这条路线,请为ROT做一点Google搜索并尝试一些示例代码。如果您对此有疑问,请告诉我们!