0

ホスト アプリケーション (アンマネージ) でユーザーからの入力の後にフォームを表示する必要がある COM 可視 DLL を C# で作成しました。で問題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 つありますが、簡単ではありません。つまり、次のことを行う必要があります。

  1. 2 番目のプロセスを起動します (たとえば、Process.Start() を使用できます)。
  2. 最初のプロセスを使用して ROT (Running Objects Table) 内を調べ、2 番目のアセンブリを見つけます。
  3. COM (OLE) 経由で自由に通信し、データを渡します

この時点で、2 つのアセンブリは別々のランタイムで実行されています。これにより、最初のアセンブリが閉じても閉じないフォームを 2 番目のアセンブリで生成できます。私が理解しているように、それはあなたが探しているものです。

このルートを試してみたい場合は、ROT について少しググって、サンプル コードを試してみてください。それについて質問がある場合は、お知らせください。

于 2012-07-20T17:41:21.173 に答える