次のエラーのため、CLSID {XXXX}のコンポーネントのCOMクラスファクトリを取得できませんでした:80040154


278

C#.NETを使用してPDFレポートを生成するWindowsサービスを開発しました。PDFファイルを生成するには、サードパーティのDLLを使用しています。アプリケーションはWindows XPプラットフォームで実行されています。Windows Server 2008 64ビットバージョンでサービスを展開すると、次のエラーが発生しました。

CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}のコンポーネントのCOMクラスファクトリの取得は、次のエラーのため失敗しました:80040154。

regsvr32コマンドを使用してDLLを登録しました。レジストリでこのCLSIDを確認できました。しかし、問題は解決しません。

何が問題でしょうか?


1
同じサーバーでホストされているWebアプリケーションは、エラーなしでPDFファイルを生成できます。
gopal 09年

みんな私は可能な解決策をすべて試しましたが、まだこのエラーが出ます。アセンブリがあり、それらを正常に登録しましたが、それでも同じエラーが発生します。本当に助けが必要です...
newprogress

回答:


383

VS-プロジェクトプロパティ-[ビルド]タブ-プラットフォームターゲット= X86


7
VS2008では、このオプションは[コンパイル]-> [高度なコンパイルオプション...](ウィンドウタブの下部)にあり、次に[ターゲットCPU](x86)
Rodolfo

1
あなたは+1よりも価値がありますが、私が与えなければならないのは+1だけです
David

7
これは常に解決策とは限りません。

2
あなたは私に7つのオフショア銀行口座、ホットドッグスタンド、そして私の結婚を保存しました。ありがとう
ドナルド。

2
同じエラーメッセージが表示されますが、この解決策は機能しません。
Akram Khan

59

私はよく似た問題に遭遇しました。

64ビットマシンで開発されていたWebアプリケーション内で古い32ビットDLLを使用する必要がありました。そのフォルダーにあるregsrv32のバージョンを使用して、32ビットDLLをwindows \ sysWOW64フォルダーに登録しました。

サードパーティDLLの呼び出しはVisual Studioの単体テストで機能しましたが、IISでホストされているWebアプリケーションから同じマシンの80040154エラーで失敗しました。

アプリケーションプールを「32ビットアプリケーションを有効にする」に変更すると、問題が解決しました。


1
これは、この問題を修正するために私が見つけた最も簡単な方法です。ありがとう!
デクスター2012年

6
私はこの答えが大好きです。ある時点で1つの小さな32ビットDLLのみを呼び出す場合は、x86用にWebサイト全体をコンパイルしても意味がありません。
DanM7 2012年

@Daniel Ballinger私のアプリケーションは変更を行う際に32ビットプロセスとして実行されますか?
初心者

@Danny sysWOW64に登録したDLLにアクセスできないため、私はそうは思わない。
Daniel Ballinger、2014年

1
私は同じ問題を抱えているが、私はこれを行う必要がある変更のアプリケーションプールに、plzは私を助ける方法を知ってはいけない
Shima.Y

58

サービスが「任意のCPU」に対して構築されたようで、COMコンポーネントを使用している64ビットでエラーが発生します。のためにビルドする必要がありx86ます。

Webサイトはおそらく32ビットプロセスとして実行されているため、コンポーネントを使用できます。ソリューションを構築x86すると、サービスが32ビットとして実行されます。


私も同じ問題に直面しています。ここで、デスクトップアプリケーションが64ビットシステムに正常にインストールされています。インストール中に同期を正常に実行しましたが、ソフトウェアから同期を実行すると、上記のエラーが表示されます
Mohini Mhetre

登録しようとしています.ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)が、エラーが発生しますモジュールのロードに失敗しました。バイナリが指定されたパスに保存されていることを確認するか、バイナリまたは依存.DLLファイルの問題をチェックするためにそれをデバッグします。
Naveen Kumar 2017

32ビットとしてコンパイルされている場合は、SysWow64バージョンではなく、System regsvr32を使用する必要があります。
Fandango68

SSISパッケージの実行中にこのエラーが発生します。接続は正常に機能しています。すべてのプロパティは正しいです。実際、SSISパッケージは何ヶ月もの間エラーなく実行されていました。突然、エラーが発生しました。ランタイム/デバッグをx64からx86に変更しようとしましたが、まだ問題は解決していません。
IamVISH

16

プロジェクトプロパティプラットフォームターゲットX86を構成する必要はありません。そのようなx86で動作するようにiisオプションを構成することもできます

  • アプリケーションプールを選択
  • アプリが使用するプールを選択します
  • 高度な設定
  • 32ビットアプリケーションを有効にし、真

これは常に私に当てはまります。真= X86にプラットフォームターゲットを設定するが、常に•32ビットアプリケーション= Trueの設定•アイデンティティ= ApplicationPoolIdentity•負荷ユーザープロファイルを有効にしなければならなかったことはありません
Zathを。

Nazimの指示に従って修正された同様の問題がありましたが、 "Embed Interop Types"(参照されたdllのプロパティ)ではなく、Copy Local = trueに設定する必要がありました。
cymorg 2016年

「アプリケーションプールを選択する」方法を教えてください。
CodyBugstein

アプリケーションプールメニューは、左側のiisメニューのリストにあります
nazim hatipoglu

16

Any CPUアプリケーションを再コンパイルせずにこれを機能させる方法を探している場合は、別の潜在的な回避策を次に示します。

  1. HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}でCOMオブジェクトのGUIDを見つけます
  2. 見つかったら、新しいREG_SZ(文字列)値を追加します。名前はAppIDで、データは検索したばかりのCOMオブジェクトGUIDである必要があります
  3. HKey_Classes_Root \ Wow6432Node \ AppIDの下に新しいキーを追加します。新しいキーは、COMオブジェクトのGUIDと同じように呼び出す必要があります。
  4. 追加した新しいキーの下に、新しい文字列値を追加し、DllSurrogateと呼びます。値は空のままにします。
  5. HKey_Local_Machine \ Software \ Classes \ AppID \の下に新しいキーを作成します。ここでも、新しいキーはCOMオブジェクトのGUIDと同じように呼び出す必要があります。このキーの下に値を追加する必要はありません。

私はこのソリューションを信用していませんが、私たちにとってはうまくいきました。詳細およびその他のコメントについては、ソースリンクを確認してください。

ソース:https : //techtalk.gfi.com/32bit-object-64bit-environment/


1
最も優れた指示。サードパーティのツールを使用していたため、ビルドプラットフォームを変更できませんでした。このソリューションはその問題を回避しました。ありがとうございました!

手順1で説明したようにキーを見つけました。問題を引き起こしているCOMオブジェクトがわかったので、それに対してregsvr32を実行しました。どうもありがとう!
MichaelS 2014年

これを行ったとき、ローカルWebサーバー(IIS)がアクセスを拒否され始めました。これは正しい方向への一歩であることがわかりますが、現時点で誰にアクセス権を与えるべきかわかりません。 stackoverflow.com/questions/14019401/…–
user420667

14

問題は、サーバープロセスが64ビットでライブラリが32ビットであり、同じプロセス(インプロセスサーバー)でCOMコンポーネントを作成しようとすることです。サーバーを再コンパイルして32ビットにするか、サーバーを変更せずにCOMコンポーネントをアウトプロセスにします。COMサーバーをアウトプロセスにする最も簡単な方法は、COM +アプリケーションを作成することです-コントロールパネル->管理ツール-> ComponentServices。


COM +アプリケーションを作成しようとしたときにエラーが発生しました。An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee

8

コンパイル設定は変更していません。

AppPoolの詳細設定で「32ビットアプリケーションを有効にする= True」に設定するだけです。

それは私のために働いた


1
AppPoolの詳細設定はどこにありますか?
CodyBugstein

7

Windows 2008サーバーx64のソリューションは次のとおりです。

  1. 管理者権限でcmd.exeを開きます。
  2. dllをC:\ Windows \ SysWOW64フォルダーにコピーします。
  3. C:\ Windows \ SysWOW64からregsvr32を実行します。
  4. dllがWindowsのレジストリにあることを確認します。
  5. dllを使用する.exe x86がある場合、exeはx86モードでコンパイルする必要があります。
  6. exeはC:\ Program Files(x86)フォルダーにインストールする必要があります。

この手順は有効で、問題ありません。


6

私は同じ問題を抱えていましたが、他の回答は解決策の一部しか提供しませんでした。

解決策は2つあります。

レジスターから64ビットを削除します。

  • c:\ windows \ system32 \ regsvr32.exe / U
  • これにより、他のフォルダにある他のdllのコピーへの参照は削除されません。

または

  • HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32というキーを見つけます。このキーには、デフォルト値としてDLLのファイル名が含まれます。
  • HKEY_CLASSES_ROOT \ CLSID {......}フォルダを削除しました。

それを32ビットとして登録します。

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

64ビット登録を削除せずに32ビットとして登録しても問題は解決しません。


ビンゴ!それが私が探していた答えです(他の場所にある私のコメントを参照してください)。ありがとう!
Fandango68

5

異なるが類似の修正で関連する問題がありました:

64ビットDLLを使用してWindowsサービスプロジェクトを「Any-CPU」に設定しました。同じエラーメッセージ。たくさんのことを試しましたが、何もうまくいきませんでした。最後に、プロジェクトの[プロパティ]-> [ビルド]に移動し、プロジェクトで[32ビット優先]がオンになっていることに気付きました。これをオフにすると、エラーは発生しません。

私の推測では、Windowsサービスは32ビットDLLを予期しており、それを見つけることができませんでした。


それは奇妙ですが、それは動作します!! ありがとう
FindOutIslamNow 2017年

3

x86に変更するには:

  1. ソリューションのセットアッププロジェクトを作成します。
  2. 作成したら、ソリューションエクスプローラーに移動し、セットアッププロジェクトを右クリックします。
    • Configuration Managerを押します。
    • 「アクティブソリューションプラットフォーム」コンボボックスをクリックし、[新規]を選択します(x86が表示されない場合)。
    • 最初のコンボx86から​​選択し、次にOKを押します。
    • セットアッププロジェクトを再ビルドしてから、すべてのプロジェクトを再ビルドします。

3

Webサイトを実行している場合は、(プールの詳細設定で)32ビットアプリケーションを無効にするようにアプリケーションプールを設定することもできます。


2
私はその逆で、32ビットアプリケーションを有効にする必要がありました。
row1

2

私の個人的なケースでは、問題は開発者のマシンのWindowsのレジストリでクラスIDを検索して修正されました(この問題はクライアントPCでスローされたため)。このアクションは、問題の原因となるCOMコンポーネントに配置されます。インストーラーまたはアップデーターアプリケーションのOCX / COMとして登録されていなかった、.NETプロジェクトで参照されているx86ライブラリ

よろしく


1

VSTOを使用している人にとって、私にとっての問題はofficeアセンブリへの参照が欠落していることでした。また、特定のVSTOオブジェクトを手動でインスタンス化しようとした場合にも表示されます。


1

DLLの実際の登録に関連する問題が見つかりました。

最初にCMDプロンプトから "Regedit.exe"を実行します(セキュリティレベルをAdministratorに上げました。 "念のために")。次に、レジストリを検索します(RegEditメニューの[編集/検索]をクリックするか、Ctrl + Fを押します)。 COMクラスファクトリに関して受け取ったエラーメッセージに表示されるCLSIDの場合。私のCLSIDは29AB7A12-B531-450E-8F7A-EA94C2F3C05Fでした。このキーが見つかったら、そのHiveノードの下のサブキー「InProcServer2」を選択し、右側のRegeditフレームで問題のDLLのファイル名を確認します。「デフォルト」の下に表示されます。そのファイルが「C:\ Windows \ SysWow64」(C:\ Windows \ SysWow64 \ Redemption.dllなど)にある場合は、「C:\ Windows \ SysWow64 \ RegSvr32.exe」ファイルを使用してコマンドラインからDLLを登録します。デフォルトの "C: C:\ Windows \ SysWow64 \ RegSvr32.exe c:\ Windows \ SysWow64 \ Redemption.dllを押して入力します。コマンドウィンドウを閉じます([終了]でコンピュータを再起動します)(奇妙なことに)再起動ではすべてのシャットダウンと再読み込みを実行しますが、[シャットダウン]と電源投入では再起動します。ドライバーとその他の値の格納されたキャッシュ(これは障害の可能性があります)。将来DLLを登録するときは、C:\ Windows \ SysWow64フォルダーに格納されているDLLにSysWow64 "RegSvr32.exe"を使用し、この問題c (それが誤った登録が原因である場合)再び発生することはありません。


すばらしいヒントですが、32ビットDLLをSysWow64に登録すると、DLLに64ビット要求を処理するラッパーがあると想定されます。
Fandango68

0

私の問題は、プロジェクトのReferencesに間違ったMS Sync FrameWorkバージョン(1.0)があったことでした。バージョン2.1にアップデートした後、エラーはなくなり、また、問題はなくなりました。


0

私の場合、wordorのようなms officeファイルを作成しています。DCOMConfigで、OFFICE関連の名前項目(name contains またはorなど)を選択するほか、この回答としてexcel実行Win+Rして実行します。dcomcnfgExcelWordOfficeOpen the properties, select Identity tab and select the interactive user.

エラーメッセージが表示されるCLSID {000209FF-0000-0000-C000-000000000046}ので、DCOM Configでこの特定のCLSIDを検索する必要がありますが、それは終了します。それを選択し、同じ手順に従ってを設定するとinteractive user、機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.