web-dev-qa-db-ja.com

クラスが登録されていないエラー

64ビットコンピューターでVisual Studio 2012からアプリケーションを実行すると、次のエラーメッセージが表示されます。

次のエラーのため、CLSID {F2D4F4E5-EEA1-46FF-A83B-A270C92DAE4B}のコンポーネントのCOMクラスファクトリを取得できませんでした:80040154クラスが登録されていません(HRESULTからの例外:0x80040154(REGDB_E_CLASSNOTREG))

VisualStudioでInventor packandgo DLLライブラリを使用しています。

誰もがエラーを知っていますか?

14
Arun

私の問題と解決策

  1. 64ビットの2008 R2マシンにインストールした32ビットのサードパーティdllがあります。

  2. プロセス用に32ビットのサードパーティdllを呼び出す.net 4.5フレームワークで作成されたwcfサービスがあります。 「任意の」CPUをターゲットとするビルドプロパティを設定し、64ビットマシンに展開しました。

  3. Iiがwcfサービスを呼び出そうとすると、エラー「80040154 Class not registered(HRESULTからの例外:0x80040154(REGDB_E_CLASSNOTREG)」が発生しました

  4. IiはProcMon.exeを使用してcomレジストリの問題を追跡し、プロセスがHKLM\CLSIDおよびHKCR\CLSIDでレジストリエントリを探していることを特定しました。

  5. Microsoftが32ビットcomコンポーネントを64ビットマシンのパスHKLM\CLSID、HKCR\CLSIDに登録せず、HKLM\Wow6432Node\CLSIDおよびHKCR\Wow6432Node\CLSIDパスにエントリを配置することを知りました。

  6. 競合は、64ビットマシンで32ビットプロセスを呼び出そうとする64ビットプロセスであり、HKLM\CLSID、HKCR\CLSIDのレジストリエントリを検索します。解決策は、HKLM\Wow6432Node\CLSIDおよびHKCR\Wow6432Node\CLSIDのレジストリエントリを64ビットプロセスに強制的に確認させることです。

  7. これは、「任意」ではなく「X86」マシンをターゲットとするようにwcfサービスプロジェクトプロパティを構成することで実現できます。

  8. 「X86」バージョンを2008 R2サーバーに展開した後、「System.BadImageFormatException:ファイルまたはアセンブリをロードできませんでした」という問題が発生しました

  9. Solutionこのbadimageformatexceptionは、IIS適切なapppoolのApppoolプロパティで 'Enable32bitApplications'を 'True'に設定しています。

31
Waheed

問題は、DLLがWindowsレジストリの32ビットバージョンに登録されており、アプリケーションが64ビットバージョンを使用していることです。

解決策:[プロジェクトプロパティ]の[コンパイル]タブに移動し、[高度なコンパイルオプション...]をクリックします。 「ターゲットCPU」をx86に変更し、[OK]をクリックして保存し、再試行します。

出典: http://www.theogray.com/blog/2009/10/comexception-regdbeclassnotreg-on-64-bit-windows

VB 6 COM DLL。Net 4 Winformsアプリケーションから呼び出された

7
Mariano Quevedo

使用しているコードのどこかに、Win32 API CoCreateInstance の呼び出しがあり、DLLを動的にロードし、そこからオブジェクトをインスタンス化します。

コンポーネントIDとそのオブジェクトをインスタンス化できるDLLとの間のマッピングは、通常レジストリのHEKY_CLASSES_ROOT\CLSIDにあります。これについてさらに詳しく説明するには、多くのことを説明します WindowsのCOM 。ただし、エラーは、COM guidがレジストリに存在しないことを示しています。

PackAndGo DLL(オートデスクコンポーネント)が何であるかについてはあまり知りませんが、そのコンポーネントまたは指定されたインストーラーに付属するソフトウェアパッケージを単に「インストール」する必要があると思います。 DLLと、コードを実行しようとしているコンピューター上の適切なCOMレジストリキーを持ちます。この製品のsetup.exeを実行します)。

つまり、DLL=をターゲットマシンにコピーするだけでなく、このコンピューターに "Pack and Go"をインストールする必要があると思います。

また、インストールするPack And Goのビルドフレーバー(32または64ビット)に応じて、32ビット対64ビットとして適切なコードをビルドすることを決定してください。

4
selbie

64ビットWindowsマシンでは、COMコンポーネントをHKEY_CLASSES_ROOT\CLSID(64ビットコンポーネント)OR HKEY_CLASSES_ROOT\Wow6432Node\CLSID(32ビットコンポーネント)に登録する必要があります。アプリケーションが32ビットアプリケーションの場合64ビットマシンで実行している場合、COMライブラリは通常Wow64ノードの下でGUIDを探し、アプリケーションが64ビットアプリケーションの場合、COMライブラリはHKEY_CLASSES_ROOT\CLSIDからロードしようとします。正しいプラットフォームをターゲットにしており、正しいバージョンのライブラリ(32/64ビット)がインストールされていることを確認してください。

1
Rajesh

長い間解決したと思いますが、これは他の貧しい人々の魂を助けるかもしれません。

このエラーは、DLLインストールパッケージでデプロイしているものがDLL参照しているものと異なる場合(これらは異なるIDになります)

当たり前のように聞こえますが、dllに小さな変更を加え、以前にDLLを再登録する自分のマシンにアプリをインストールしていた場合、簡単に発生します。

1
apc

同じ問題がありました。私は多くの方法を試しましたが、ついに解決策は簡単になりました。解決策:IISを開き、アプリケーションプールで、使用されている.netフレームワークを右クリックします。設定に移動し、「32ビットアプリケーションを有効にする」を「True」に変更します。

0
Sunil Xtha

32ビットアプリケーションで以下のエラーが発生していました。

エラー:CLSID {4911BB26-11EE-4182-B66C-64DF2FA6502D}のコンポーネントのCOMクラスファクトリの取得は、次のエラーのために失敗しました:80040154クラスが登録されていません(HRESULTからの例外:0x80040154(REGDB_E_CLASSNOTREG))。

defaultapplicationpool inで "Enable32bitApplications"をtrueに設定すると、IISが機能しました。

0
Deeku

この問題があり、かっこで指定されたWindowsレジストリを探していることがわかったときに解決しました。

エラーは1台のコンピューターでのみ発生していたので、私がしなければならなかったことは、それが機能していたコンピューターからレジストリーをエクスポートし、それが欠落しているコンピューターにインストールすることでした。

0
André Santaló

私は同じ問題に遭遇しました。 Microsoft.Office.Interop.Excel COMコンポーネントのdllの参照を追加しましたが、Officeがシステムにインストールされておらず、コンパイル時エラーが発生しません。アプリケーションを別のシステムに移動して実行しました。正常に動作しました。

私の場合、この問題を引き起こしていたのはシステム環境だったと言えます。

0
Ankur Bhutani