6

公開されているCOM機能を使用してアプリケーションを当社のアプリケーションにリンクしようとしている顧客/パートナーがいます。これまでのところ、ソフトウェアパッケージのインスタンスを表すCOMオブジェクトがあり、COMメソッドを使用して、アプリケーションで行ったことに基づいてユーザーのためにプログラムで何かを構築します。これは本質的に「エクスポート」機能です。

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

私はC#で簡単なデモアプリを作成しMarshal.FinalReleaseComObject(myObject)て、役に立たないようなものを使ってみました。

この種の目的でCOMを使用することは、実際には意図されたものではないことを認識していますが、何らかの回避策があるといいのですが。顧客/パートナーはVB.NETを使用していますが、C#で問題ありません。

4

1 に答える 1

3

クライアントアプリケーションに公開するCOMインターフェイスをどのように実装しているかなど、独自のアプリケーションに関する重要な情報をいくつか省略しました。私にとって危険信号であるあなたの説明の1つの側面は、アプリケーションのインスタンス化です。クライアントアプリケーションは、「VBを使用して、exeを参照して新しいプロセスを開始する」と言います。COMサーバーを適切に実装および登録している場合、これは必要ありません。あなたが求めることを達成するために私が使用するアーキテクチャについてお話ししましょう。これがあなたにとって役立つことを願っています。

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

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

インターフェイスが解放されていない間は、 COMサーバーをシャットダウンしないでください。これは、クライアントアプリケーションがインターフェイスを適切に解放する責任があることを意味します。ただし、.NETテストフレームでこれを実行する必要があるため、実装に問題があるようです。

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

于 2012-05-08T05:23:32.110 に答える