2012-05-02 10 views
6

私は、公開されたCOM機能を使用して自分のアプリケーションを私たちとリンクしようとしている顧客/パートナーを抱えています。これまでは、ソフトウェアパッケージのインスタンスを表すCOMオブジェクトを取得してから、COMメソッドを使用して、アプリケーションで行ったことに基づいてユーザーのために何かをプログラムで構築しています。これは基本的に「エクスポート」機能です。.NETのCOMオブジェクトの「所有権」を解放します

どのようにすればいいのかわからないものは、ユーザーがインスタンスをいつ閉じるかをユーザーが決定できるようにすることです。つまり、私たちのソフトウェアパッケージが読み込まれ、表示され、ユーザーと対話しているときです。終了したら、右上の十字をクリックしてソフトウェアを終了します。これは、COMオブジェクトがアプリケーションでまだ「アクティブ」なので機能しません。私たちのソフトウェアパッケージは、COMを介してアプリケーションをロードしたアプリケーションが開いたままタスクマネージャでプロセスを強制終了することによってのみ閉じることができます。アプリケーションが終了すると、私たちは自動的に閉じます。彼らのアプリケーションがCOM呼び出しのために私たちのものを所有しているかのようです。

Marshal.FinalReleaseComObject(myObject)のようなものを使用しないようにするために、C#で簡単なデモアプリケーションを作成しました。

私は、この種のものにCOMを使用することは、それが意図しているものではないことを認識していますが、うまくいけば回避策がありますか?顧客/パートナーはVB.NETを使用していますが、C#は問題ありません。

+0

アプリケーションが内部アプリケーション(VSまたはOfficeアプリケーション内のVBAスクリプトに似ています)または外部(Wordオートメーションを使用して独自のコンソールアプリケーション/スクリプトから新しいドキュメントを作成するのと同様)から自動化されているかどうかを明確にしてください。 –

+0

窓を閉じることはできませんか?それは意味をなさない、あなたは明確にする必要があります。 –

+0

外部からは、exeを参照してCOMオブジェクトをインスタンス化することによって、VBを使用して新しいプロセスを開始しています。私たちは "Open"を持っています。これはまさにそのようなもので、私たちのソフトウェアパッケージの使用可能なウィンドウを開きます。ウィンドウを閉じることができないという点では、右上の赤いXをクリックすることはできませんが、何も起こりません。 VBアプリケーションが終了すると閉じられます。私はCOMの相互運用機能についてはよく分かりませんが、VBアプリケーションの所有権があるか、そのプロセスの親であるようです。 – sxthomson

答えて

3

クライアントアプリケーションに公開するCOMインターフェイスを実装する方法を含め、独自のアプリケーションに関する重要な情報を除外しました。私のための赤い旗である説明の1つの側面は、アプリケーションのインスタンス化です。あなたは、クライアントアプリケーションは、 "私たちのexeファイルを参照して新しいプロセスを開始するためにVBを使用する"と言っています。これは、COMサーバーを正しく実装して登録している場合は必要ありません。私があなたの求めるものを達成するために使うアーキテクチャーを教えてください。うまくいけば、これはあなたにとって有益なものです。

まず、別のプロセス内からCOMオブジェクトを提供する場合、適切な方法はCOMアウトプロセスサーバーを実装することです。アウトオブプロセスサーバーでは、クライアントがCOM経由でいずれかのインターフェイスを要求すると、COMは自動的にアプリケーションを起動します。アウトオブプロセスサーバーの実装要件の一部は、最後のCOMクライアントが最後のインターフェイスポインタを解放すると自動的にシャットダウンすることです。

アウトプロセスサーバーからユーザーインターフェイスを公開するには、メッセージループを持つ別個のシングルスレッドアパートメント(STA)スレッドを生成する必要があります。これにより、COMサーバーを強制終了せずに、メインウィンドウを含むSTAスレッドのウィンドウを閉じることができます。これは、COMサーバー実装では、proc呼び出しからCOMをサポートするために、独自のマルチスレッドアパートメント(MTA)メッセージループスレッドを実行するためです。 MTAスレッドはメインのアプリケーションスレッドであり、最後のクライアントインターフェイスが解放されるとサーバーはシャットダウンします。

インターフェイスは未リリースのままシャットダウンしないでください。つまり、クライアントアプリケーションはインターフェイスを適切に解放する責任があります。しかし、.NETのテストフレームはこれを行っているはずなので、あなたの実装では適切ではないようです。

このガイダンスに従うと仮定すると、最後のクライアントインターフェイスがリリースされていてもまだUIウィンドウが開いているシナリオを処理する計画が必要です。すべての設定が正しく完了したら、これは大きな問題ではありません。たとえば、UIが開いている間に、自分のインターフェースの1つへの参照を取るだけで、MTAのシャットダウンを防ぐことができます。

関連する問題