私は、公開されたCOM機能を使用して自分のアプリケーションを私たちとリンクしようとしている顧客/パートナーを抱えています。これまでは、ソフトウェアパッケージのインスタンスを表すCOMオブジェクトを取得してから、COMメソッドを使用して、アプリケーションで行ったことに基づいてユーザーのために何かをプログラムで構築しています。これは基本的に「エクスポート」機能です。.NETのCOMオブジェクトの「所有権」を解放します
どのようにすればいいのかわからないものは、ユーザーがインスタンスをいつ閉じるかをユーザーが決定できるようにすることです。つまり、私たちのソフトウェアパッケージが読み込まれ、表示され、ユーザーと対話しているときです。終了したら、右上の十字をクリックしてソフトウェアを終了します。これは、COMオブジェクトがアプリケーションでまだ「アクティブ」なので機能しません。私たちのソフトウェアパッケージは、COMを介してアプリケーションをロードしたアプリケーションが開いたままタスクマネージャでプロセスを強制終了することによってのみ閉じることができます。アプリケーションが終了すると、私たちは自動的に閉じます。彼らのアプリケーションがCOM呼び出しのために私たちのものを所有しているかのようです。
Marshal.FinalReleaseComObject(myObject)
のようなものを使用しないようにするために、C#で簡単なデモアプリケーションを作成しました。
私は、この種のものにCOMを使用することは、それが意図しているものではないことを認識していますが、うまくいけば回避策がありますか?顧客/パートナーはVB.NETを使用していますが、C#は問題ありません。
アプリケーションが内部アプリケーション(VSまたはOfficeアプリケーション内のVBAスクリプトに似ています)または外部(Wordオートメーションを使用して独自のコンソールアプリケーション/スクリプトから新しいドキュメントを作成するのと同様)から自動化されているかどうかを明確にしてください。 –
窓を閉じることはできませんか?それは意味をなさない、あなたは明確にする必要があります。 –
外部からは、exeを参照してCOMオブジェクトをインスタンス化することによって、VBを使用して新しいプロセスを開始しています。私たちは "Open"を持っています。これはまさにそのようなもので、私たちのソフトウェアパッケージの使用可能なウィンドウを開きます。ウィンドウを閉じることができないという点では、右上の赤いXをクリックすることはできませんが、何も起こりません。 VBアプリケーションが終了すると閉じられます。私はCOMの相互運用機能についてはよく分かりませんが、VBアプリケーションの所有権があるか、そのプロセスの親であるようです。 – sxthomson