2009-05-17 18 views
13

ソースコードを持たないレガシー32ビットコードを、64ビット.NETアセンブリから呼び出せるような方法でプロジェクトに統合する必要があります。元のコードは、DLL内の32ビットCOMオブジェクトとして実装されています。 Windowsでは、64ビットから32ビットのオブジェクトへの直接呼び出しは許可されていないため、このような状況にどう対処するかについてのインスピレーションを探しています。64〜32ビットInterop - どのように?

64ビット.NETアセンブリからどのようにレガシー32ビットCOMオブジェクトにアクセスできますか?

更新:COMコンポーネントは、元のソースを作成するANSI Cのラッパーであることがわかりました。私たちは、Visual Studioのネイティブ64ビットDLLとしてコンパイルし、.NETにインポートすることができました。ゴールポストを動かすことは残念です!

+0

コメント、私はそれを行っていないので、COMオブジェクトをアウトプロセスサーバーとして実行する必要があります。インプロセスとしてロードすると、64ビットとして実行され、失敗します。 –

答えて

8

最善の方法は、32ビットDLLをラップするプロセス外COMサーバーを作成することです。 64ビットコードからこれを呼び出すことができます。

Here is an explanationの基本概念です。

+0

私たちは別の解決策を導いたソースコードを発見したので、ゴールポストを少し動かしました。私はこの答えを受け入れています。私はそれが元の質問に答えるのに最も役立つと思っています。 –

3

あなたがする必要があるのは、IPCと通信する2つのプロセスを作成することです。このようにして、1つは32ビットになり、1つは64ビットになります。 COMオブジェクトにリンクし、名前付きパイプなどのIPCメカニズムを介してAPIを公開する32プログラムを作成する必要があります。これにより、.NETプログラムは別のプロセスからアクセスできます。

+0

このアプローチは機能しますが、すでにCOMを使用している場合は、COM相互運用機能を使用するのではなく、名前付きパイプに切り替えるのはなぜですか? –

+0

@Reed Copsey:ああ、もちろん、COMのためにそれを使うことができます。しかし私のアプローチはもっと一般的です。それは通常のライブラリでも機能します。 – Zifre

+0

名前付きパイプを使ってIPCを行うためにWCFを使用することを考えました。パイプの両端は、32ビットのアセンブリでなければならない同じインタフェース定義を参照する必要があります。あなたがそれを実行しようとすると、すべてが爆発する。 –

3

これをチェックアウトするblog post。ランタイム呼び出し可能ラッパーを使用して64ビット.NETアプリケーションから32ビットCOMアセンブリを参照できます。あなたの場合はCOMアセンブリ(ないRCW)を登録

tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll

  • :ショートバージョンは64ビットランタイム呼び出し可能ラッパーを作成するには、次の...

    1. 使用Tlbimp.exeをありますまだの:

      regsvr32.exe foo.dll

    2. リファレンスRCW(例えばInterop.Foo.dll )をアプリケーションから削除します。あなたのビルド構成をx64に変更し、ロックしましょう。

  • +0

    これは元の問題の解決策ではありません。 –