質問

シナリオ:2つのC#プロジェクトを含むプロジェクトがあります。これは、歴史的な理由により、COMを使用して(COM Interopを介して)互いに通信する必要があります。 COMサーバーはインプロセスオートメーションオブジェクト(これを「サーバー」と呼びます)であり、COMクライアントは次のようにサーバーをロードする単純なC#コンソールアプリケーションです:

        var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
        var objLateBound = Activator.CreateInstance(objType);

Visual Studioは、プロジェクト設定でそのオプションが有効になっている場合、COM Interopのアセンブリを自動的に登録するため、サーバーの登録に使用します(ここでの開発者の経験にのみ興味があり、インストールは別の問題です)プロジェクトが32ビットコードを生成するように設定されているか、COMクライアントが32ビットである限り、正常に動作します。

64ビットシステムでの開発時に問題が発生し、両方のプロジェクトが「任意のCPU」のコードを生成するように設定されているため、64ビットモードで実行されます。これにより、次のエラーが発生します。

"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."

調査の結果、MSBuildスクリプトは32ビットの登録のみを実行しているようです。 ProgIDは、そのサブキーCLSIDおよび適切なclassIDとともに64ビットレジストリセクションに配置されます。しかし、CLSID {clsid}のものはありません。 32ビットの場合、WOW6432サブツリーにのみ存在します。そのため、アクティベータは物を見つけることができないため、クラスファクトリを取得できません。

これに対する回答が得られれば、SOコミュニティに本当に感銘を受けますが、ここにあります:

この問題に遭遇した人はいますか?どのように解決しましたか? COM Interopアセンブリが64ビット開発マシンで正しく登録されるようにする最も簡単な方法は何ですか?

役に立ちましたか?

解決

この問題に遭遇し、x86用のアセンブリを生成するようにプロジェクトを設定することで解決しました。もちろんこれは最適ではありませんが、いくつかのネイティブ32ビットライブラリもあるため、とにかくそれをしなければなりませんでした。

他のヒント

次のKBアイテムでこれを解決できました。基本的に、プロジェクトのビルド設定でCOM相互運用機能の登録をオフにし、ビルド後のコマンドを使用しました。

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

http://support.microsoft.com/kb/956933

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top