2011-12-23 17 views
1

C#からC#COMオブジェクトを呼び出そうとしています。 私はC#でクラスライブラリを作成し、tlbexe.exeを使用してタイプライブラリをエクスポートしました。私はregtlibv12.exeを使ってタイプライブラリを登録しました。しかし、Visual StudioでCOMオブジェクトへの参照を追加すると、次のようなエラーが表示されます。C#から管理されたC#COMオブジェクトを呼び出す

".NET XアセンブリからエクスポートされたアクティブなXタイプライブラリは、参照として追加できません。代わりに.NETアセンブリに。 "

ご協力いただければ幸いです。

+2

答えはエラーメッセージです。を追加してください。 .NETアセンブリとしての.NETアセンブリ。 COMを通過する必要はありません –

+1

これはなぜ重要ですか?これは難しいことではありません。アセンブリ参照を追加するだけです。 TLBではなくDLL。マシンをだますための唯一の方法は、レイトバインドを使うことです。 *動的*キーワードを使用してC#で最も簡単です。 –

+1

これは、COMインターフェイスとしてDLLインターフェイスを公開するCOMオブジェクトを作成して、64ビットコードから32ビットDLLにアクセスできるようにするためです。ここで説明されているようにhttp://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/ – Reflux

答えて

3

64ビットプロセスが32ビット管理不能コードに直接アクセスすることはできません。 64ビットシステムにはCOMオブジェクトの2つのドメインがあります。 1つは64ビットプロセス用、もう1つは32ビットプロセス用です。彼らはレジストリに異なる登録エリアを持っているので、32ビットのみのCOMオブジェクトを登録すると、64ビットプロセスに関する限り存在しません。 ANY_CPUの対象となるアセンブリをCLRによって64ビットまたは32ビットのいずれかのプロセスにロードできます。しかし、ANY_CPUアセンブリが64ビットプロセスにロードされても、32ビットのアンマネージコードをロードできるわけではありません。 articalで解決されたソリューションは、DCOMとIPCを使用して、64ビットから32ビットコードへのプロセス外呼び出しを作成します。

WCFを使用して.NETで同じことをもっと簡単に行うことができます。 32ビットマネージドコードにアクセスする32ビットのWCFサーバープロセスを作成します。あなたの64bitプロセスはWCFクライアントであり、32bitサーバへの呼び出しを行います。 WCFでサポートされている名前付きパイプproticalを使用すると、ネットワークスタックを回避できます。

+0

そうですね。私はDCOMとCOMを混ぜ合わせました。名前付きパイプでWCFを使用した場合、64ビットバージョンのdllを保留にした場合と比較して、どのようなパフォーマンスが得られるのでしょうか? – Reflux

+1

明らかに、プロセス空間に直接ロードされたDLLほど速くはありません。速度は、メソッド呼び出しのパラメータデータのサイズに直接関係すると思います。これはintよりもパイプの巨大な構造体を直列化して転送するのに時間がかかります。 – user957902

2

上記のコメントに記載されているarticleは、アンマネージ(またはネイティブ)コードに適用されます。これは、ホストアプリケーションをAnyCPUとしてコンパイルした場合、.NETでは問題ではありません(x86マシンでx64アセンブリを使用すると問題が発生する可能性がありますが、これは確かではありません)。 32ビットDLLのCOM相互運用機能は無視してもかまいません(別のものは必要ないと仮定しています)。64ビットアセンブリから参照するだけです(ターゲットアーキテクチャをAnyCPUに変更してください)。

+0

私が参照したい32ビットdllはアンマネージドコードです。それを参照できる64ビットアセンブリはありますか?私は現在64ビットマシンにアクセスしてテストしていますが、私のチームの他の開発者には問題があると言いました。 – Reflux

+0

@Reflux - x86(32ビット)は64ビットマシン上で実行可能であるため、アセンブリも準拠しています。そしてそれが私のお勧めです。あなたの "ホスト"プログラムをx86アセンブリとしてコンパイルし、標準のP/Invoke APIを使用してアンマネージの32ビットDLLにアクセスしてください。 –

関連する問題