0

我在 C# 中创建了一个 COM Visible DLL,它应该在主机应用程序(非托管)中用户的一些输入后显示一个表单。它可以正常工作ShowDialog(),但理想情况下,即使在 DLL 完成后,表单也应该继续运行。因为表单需要一些数据,所以不能使用单独的项目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应该在哪里插入。

4

1 回答 1

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) 自由通信并传递您的数据

此时,两个程序集在不同的运行时中运行,这将允许您在第二个程序集中生成不会在第一个程序集关闭时关闭的表单。据我了解,这就是您要寻找的东西。

如果您想尝试这条路线,请在谷歌上搜索一下 ROT 并尝试一些示例代码。如果您对此有任何疑问,请告诉我!

于 2012-07-20T17:41:21.173 回答