2011-11-19 10 views
5

短い質問:もちろん(x64 OSでも)可能ですか?そうでない場合、なぜ正確に?それが正常に動作したx86でコンパイルすると32ビットアプリケーションからCOM経由でx64アセンブリを呼び出す

私は、Excel 32

のためのC#プラグインDLLを開発しました。

x64でコンパイルすると、COM呼び出しが失敗します。

私はExcelの64ビット版が必要ですか?

COMはアーキテクチャーのコンパイルには無関係で、異なるテクノロジーで開発されたDLLとアーキテクチャが異なるDLL間で通信が可能だと思っていましたが、後者は間違っていると思います。

x64ビットのDLLは、明らかに32ビットアプリケーションからCOM(または他のもの)経由で呼び出すことはできないと思います。

+0

64ビットコードを実行するには、おそらく64ビットシステム(少なくともカーネル)が必要です。 –

+0

@BasileStarynkevitchはい、もちろんです。投稿の精度を追加しました –

+0

AnyCPU用にコンパイルを試しましたか? – Filburt

答えて

9

COMは、インプロセスとアウトプロセスの2種類のサーバーをサポートしています。 Office拡張機能は、プロセスに読み込まれるDLLであるインプロセスコンポーネントです。 32ビットプロセスの厳しい規則は、64ビットDLLをロードできないということです。そして、その逆です。これはレジストリ自体によって強制され、32ビットプロセスは64ビットCOMサーバーの登録情報に直接アクセスできません。それらはHKLM/Software/Wow6432Nodeキーにリダイレクトされます。または言い換えれば、彼らはさえの間違ったビットのコンポーネントを参照してくださいすることはできません。

アウトプロセスコンポーネントにはその制限はなく、独自のプロセスで実行されます。 COMは、RPCとペーパーを使用して2つのプロセス間のコールをマーシャリングします。これは、インプロセスの64ビットサーバーを32ビットホストで動作させる方法でもあります。サロゲートプロセスでコンポーネントを実行できます。これは手間がかかり、処理の手間がほとんどかからず、は、必要なマーシャリングとコンテキスト切り替えのためにインプロセスコールよりも高価です。もう少し高価なだけでなく、約10,000倍遅くなります。主に、インプロセス関数呼び出しが非常に高速であるためです。従来の32ビットサーバーを64ビットプログラムで使用する場合にのみ使用されます。あなたがこれを試してみたいのであれば、COM +ホスティングを見てください。私はそれについてよく分かりません。

+0

ありがとう、仲間。これはちょうど私が探していたきれいな確認のようなものです。プロセス外の呼び出しに関する精度ははるかに高価です。貴重な結果を得ようとしている間、貴重な時間を費やしています。だから私が本当に私のx64 Frameworkに固執したいのであれば、Excelのx64ディストリビューションが必要だと思います。 –

関連する問題