2009-11-18 38 views
9

私は現在、COM経由でC++プログラム(pre-.NET)に機能を公開するC#で書かれた.NETクラスライブラリを持っています。C#でCOMオートメーションサーバーを作成する

メインアプリケーションのアドレス空間を解放するために、ライブラリをプロセス外に移動する必要があります(画像処理アプリケーションであり、大きな画像がアドレス空間を使い果たします)。私は自分のVB6の日から "OLEオートメーションサーバー"を作成できることを覚えています。オブジェクトが作成/破棄されると、OSは自動的にサーバー.exeを起動および停止します。これは私たちにとって完璧なようです:CLSCTX_INPROC_SERVERの代わりにCLSCTX_LOCAL_SERVERを使ってCoCreateInstanceを呼び出す点を除いて、クライアントで何も変わらないことがわかる限り、何も変わりません。

C#でこのようなアウトプロセスサーバーを作成するにはどうすればよいですか?それに関するオンライン情報がない、または私の用語がオフ/古いです!

+0

私はこれがサポートされていなかったことを一点の結論に達しましたが、私は避難所」どこに明示されていても見えません。私は、CoRegisterClassObjectにC#COMオブジェクトのファクトリを登録するためにインタプリタを試しましたが、動作させることはありませんでした。他の誰かが幸運を持っていれば好奇心が強い! –

+0

ここで私の答えをチェックしてください:http://stackoverflow.com/questions/24724784/com-interop-with-ipc-in-c-sharp/24732010#24732010 –

答えて

6

実際に.NETでこれを行うことができます(これは前に概念の証明として行っています)が、すべての作業(プロセス寿命、登録など)を正しく行うにはちょっとした作業です。

新しいWindowsアプリケーションを作成します。 Mainメソッドでは、RegistrationServices.RegisterTypeForComClientsを呼び出します。これは、クラスファクトリを処理するCoRegisterClassObjectを管理するラッパーです。これは、登録されたComVisibleクラスのタイプ(実際に作成したいもの - .NETがクラスファクトリーを自動的に提供するクラス)と、RegistrationClassContext.LocalServerおよびRegistrationConnectionType.SingleUseを渡します。これで、COM起動のためのLocalServer32として登録できる非常に基本的なexeが完成しました。あなたはまだプロセスの寿命を尽くさなければならないでしょう(コンストラクタ/ファイナライザを使って管理対象オブジェクトのrefcountを実装します。ゼロに達し、UnregisterTypeForComClientsを呼び出して終了します)、オブジェクトがすべて終了するまでMainを終了させることはできません。

登録はそれほど悪くはありません:HKLM \ CLSID(yourclsidhere)の下にLocalServer32キーを追加するComRegisterFunction属性メソッドを作成します。デフォルト値はexeへのパスです。 regasm yourexe.exe/codebase/tlbを実行して、あなたは良いです。ここで

+0

ありがとう:寿命管理は問題ではないことが判明しました:メインアプリケーションの起動時にアウトプロセスサーバーを起動し、終了時にシャットダウンします。だから、唯一のトリックはRegistrationServices.RegisterTypeForComClientsを呼び出すことでした - 簡単! – Grokys

2

InteropServicesを使用して.NETクラスをCOMクラスとして公開し、そのライブラリをCOM +アプリケーションとして構成することができます。 .NETライブラリはプロセス外で実行され、DLLHOST.EXEインスタンスによってホストされます。

1

は、C#(。NET)でCOMのLocalServerを作成する方法のすべての側面をカバーしていMSDNでの記事です:link

関連する問題