27

私のライブラリはAnyCPUにコンパイルされているため、x64で実行されるx64サーバーがあります。x86 で登録されている COM コンポーネントにアクセスする必要があります。COM について十分な知識がなく、Google で検索してもどこにも行きません。

質問: x64 から x86 へのシンボリック レジストリ リンクを COM コンポーネントに使用できますか? x64 でも COM コンポーネントを登録する必要がありますか? できますか(ここに何か声明があります...)?

ありがとう。

4

3 に答える 3

31

コンポーネントが x64 ネイティブで実行されている場合、32 ビット COM サーバーをインプロセスで読み込むことはできません。これは、不適切な種類のプロセスであるためです。可能な解決策がいくつかあります。

  1. 可能であれば、COM コードの 64 ビット バージョンをビルドします (もちろん、64 ビット レジストリに自身を登録します)。これは最もクリーンなソリューションですが、COM サーバーのコードがない場合は実行できない可能性があります。

  2. .NET コンポーネントを x64 ではなく 32 ビット x86 として実行します。何らかの理由でこれをすでに検討して拒否したと思います。

  3. COM サロゲートDLLhost.exeを使用して、COM コンポーネントをプロセス外でホストします。これにより、COM サーバーへの呼び出しが大幅に遅くなります (ネイティブ関数呼び出しではなく、Windows メッセージのインタープロセスになります) が、それ以外は透過的です (特別なことをする必要はありません)。

    サーバーが通常の oleaut32 を使用する代わりにカスタム プロキシ スタブを必要とする場合 (非常にまれですが)、64 ビット バージョンのプロキシが利用できないため、これはおそらくオプションではありません。通常の OLE マーシャリングを使用できる限り、代理アクティベーション用に登録するだけでかまいません。

于 2008-12-11T13:46:45.587 に答える
7

私はこの解決策を見つけました。64ビットWindowsでレガシー32ビットコンポーネントを処理する記事を参照してください:
•プロジェクトタイプをインプロセスからアウトプロセスに変換する
•ホストとしてCOM +を使用する(これは私にとってはうまくいく)
• dllhostを代理ホストとして使用する

于 2009-01-15T19:10:53.460 に答える
2

COM コンポーネントが COM サーバー (つまり、別のプロセス) に格納されている場合、COM サブシステムが x64 アプリから X86 アプリへの呼び出しをリモートで実行し、再び元に戻すため、特別なことを行う必要はありません。

コンポーネントがインプロセス COM コンポーネントである場合、64 ビット プロセスはプロセス COM コンポーネントで 32 ビットを使用できないため、再考する必要があります。サーバーを強制的に x86 で実行して、コンポーネントにアクセスできるようにすることができます (どちらも 32 ビット プロセスになります)。これを行いたくない場合は、使用している COM コンポーネントの x64 ビット バージョンがあるかどうかを確認する必要があります。

于 2008-12-11T13:48:22.200 に答える