2017-05-15 10 views
2

「DllSurrogate」メソッドを使用して、64ビットのC#exeが32ビットのC#dllと通信できるようにしています。 この方法はHosting a .NET DLL as an Out-Of-Process COM Server (EXE)に記載されています。アプリケーションが終了したときにプロセスのdll( 'dllhost.exe' 'COM Surrogate')を強制終了する最も良い方法はありますか?

「dllhost.exe * 32」という追加のプロセスが実行されると、タスクマネージャーに「COM Surrogate」という説明が自動的に表示されます。 これは、アプリケーションと32ビットdllのリンクです。

私が抱えている問題は、アプリケーションが終了するとこのプロセスが強制終了されないことです。 誰かがこれに対処するための推奨される方法を提案できますか?

私は、プロセスを見つけて、私のアプリを閉じてそれを殺すが、私は確認する必要がありますできます

  • それは、別のアプリケーションに属する1つの私の「COMサロゲート」ではありません。
  • 私のアプリケーションの別の実行インスタンスでは使用されていません。

私のアプリケーションとこのプロセスを直接確認できるリンクはありますか?

+0

Windowsのコンポーネントサービス(同じサロゲートテクノロジに依存する「com +アプリケーション」)を使用する方がずっと簡単です。クールなUIダイアログにアクセスして、どのようにシャットダウンするかなど、多くのことを実行できます –

+0

本当ですか?最近私はそれを調べたところ、COM +は非常に難しい作業であり、このアプローチははるかに単純でした。これは、これがスタンドアロンのWindowsアプリケーションであり、外部の顧客によってダウンロードされてインストールされている点で違いがありますか? –

+0

これは15年以上も同じことです。 「COM +」は単なるファンシーな(本当に?)マーケティング名です。コンポーネントサービスは、それを上回るUIです。もちろん、ロード中は、dllhost.exeも使用されます(アウトオブプロセスの場合、「ライブラリ」モードではなく「インプロセス」と呼ばれます)。このすべてをプログラムでインストールしたい場合は、スクリプトのサポートもあります。 –

答えて

3

終了を拒否するCOMサロゲートは、通常、リリースされていないCoClassまたはリソースへの未処理の参照を示します。 ReleaseComObjectまたはFinalReleaseComObjectにリリースすることで、リリースを強制することができます。ただし、このアプローチを使用する場合は、hereと記載されているように、関連するリスクに注意する必要があります。

COMサロゲートを手動で終了する以外の方法がない場合は、マシン上のすべてのdllhost.exeプロセスを列挙する必要があります。各候補のコマンドラインを抽出し、/ProcessId引数を探します。 CoClassGUIDと一致する場合は、一致するものが見つかりました。

+0

したがって、実際に閉じられているアプリケーションの処理中ではないにもかかわらず、COM代理人が自動的に終了する必要があると言っていますか? –

+0

はい、サロゲートの仕組みです。参照カウントがゼロになり、すべてのリソースが解放されるとすぐに、プロセスは終了します。これはもはや必要ではないためです。 – Aurora

+0

それは励みになります。それでは、参考にしておいたものを見ていきます。 –

関連する問題