296

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

次のエラーのため、CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} を持つコンポーネントの COM クラス ファクトリを取得できませんでした: 80040154。

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

何が問題なのですか?

4

17 に答える 17

393

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

于 2010-05-23T16:44:30.040 に答える
63

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

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

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

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

于 2010-07-27T21:31:40.417 に答える
60

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

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

于 2009-06-24T08:07:49.193 に答える
19

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

  • アプリケーションプールを選択
  • アプリが使用するプールを選択してください
  • 高度な設定
  • 32 ビット アプリケーションを有効にするtrue
于 2014-01-13T09:38:48.290 に答える
17

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/

于 2013-01-11T19:52:49.653 に答える
14

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

于 2009-06-24T08:17:01.313 に答える
8

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

解決策は 2 つあります。

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

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

また

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

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

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

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

于 2014-07-25T21:06:17.240 に答える
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) にインストールする必要があります。

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

于 2011-04-13T14:55:28.090 に答える
5

別の、しかし同様の修正で関連する問題がありました:

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

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

于 2012-12-28T02:37:10.333 に答える
3

x86に変更するには:

  1. ソリューションのセットアッププロジェクトを作成します。
  2. 作成したら、ソリューションエクスプローラーに移動し、セットアッププロジェクトを右クリックします。
    • ConfigurationManagerを押します。
    • 「ActiveSolutionPlatform」コンボボックスをクリックし、「新規」を選択します(x86が表示されていない場合)
    • 最初のコンボx86から​​選択し、[OK]を押します。
    • セットアッププロジェクトを再構築してから、すべてのプロジェクトを再構築します。
于 2011-03-19T09:08:36.220 に答える
3

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

于 2011-05-19T17:43:13.930 に答える
1

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

于 2015-05-27T16:56:49.273 に答える
0

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

于 2015-09-18T21:42:22.720 に答える