9

VC ++プロジェクトで、C#プロジェクト内に含まれるC#クラスのインスタンスを(COM経由で)作成しようとしています。

事実

  • C#プロジェクトとC ++プロジェクトはどちらも、.NET4.0を使用してコンパイルされています。
  • C#.dllはregasm / codebase "CSharpProjectName.dll" "を使用して登録されており、Windowsコマンドプロンプトで「タイプが正常に登録されました」と報告されます。
  • C ++プロジェクトで、C#プロジェクトにクラスのインスタンスを作成しようとしましたが、HRESULTが0x80040154になりました-クラスが登録されていません

これは、C#.dllから.NETオブジェクトのインスタンスを作成する試みの例です。私がインスタンス化しようとしている具体的なクラスはEmployeeと呼ばれ、質問を簡単に提示するために、IPersonインターフェイスを実装しています。

    CSharpProjectName::IPersonPtr pPersonPtr;
    HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee);

「regasm/codebase」を使用してc#.dllを登録し、レジストリにキーが存在することを確認したのに、「クラスが登録されていません」というエラーが表示されるのはなぜですか。

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

10

私は過去にその問題を抱えていましたが、それは両方のプロセスが32ビットまたは64ビットではなかったことが原因でした。32ビットOSを実行している場合は、私が言っていることが当てはまらないため、今すぐ読むのをやめることができます。

regeditを使用して、レジストリでProgIdとCLSIDを見つけてください。C ++プロジェクトが32ビットの場合は、C#クラスが32ビットハイブ--HKEY_CLASSES_ROOT\Wow6432Nodeに登録されていることを確認してください。C ++プロジェクトが64ビットの場合は、C#クラスが64ビットハイブ--HKEY_CLASSES_ROOTに登録されていることを確認してください。

64ビットハイブに登録する必要がある場合は、c:\ windows \ microsoft.net \framework64...の下にあるバージョンのRegAsm.exeを呼び出す必要がある場合があります。

うまくいかない可能性がある他の可能性は、.NET4.0バージョンのregasm.exeを実行する必要があるかもしれないということです。コマンドラインで「regasm」と入力すると、実行しているregasmのバージョンが表示されます。.NET 4.0バージョンのregasmのフルパスを入力する必要がある場合があります--c:\ windows \ microsoft.net \ framework \ v4.0.3019\regasm.exeにあります。

于 2012-03-14T22:51:09.397 に答える
1

オプションを試しました/tlbか?それを試してから

#import "your_tlb_file_lol.tlb" no_namespace

他の選択肢は、アセンブリをgacしてから、それをregasmすることかもしれないと思います。

于 2012-03-14T22:18:57.953 に答える
0

プロジェクトを知っているので、プロジェクトを32ビットのままにして、レジストリエラーで32で実行されるアクティブなコンポーネントを任意のCPUで作成するようにしてください。したがって、ビルドを32に、できれば32に変更します。

あなたはあまりにもあなたのdllをzippy32に登録します

于 2018-01-29T17:23:08.387 に答える