2009-06-24 60 views
248

我開發了一個使用C#.NET生成PDF報表的Windows服務。生成PDF文件我正在使用第三方DLL。該應用程序正在我的Windows XP平臺上運行。當我在Windows Server 2008 64位版本部署的服務,我得到這個錯誤:檢索具有CLSID {XXXX}的組件的COM類工廠失敗,原因如下:80040154

Retrieving the COM class factory for component with CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} failed due to the following error: 80040154.

我註冊使用regsvr32命令DLL。我能夠在註冊表中看到這個CLSID。但問題依然存在。

可能是什麼問題?

+1

在同一臺服務器承載的Web應用程序可以生成PDF文件沒有任何錯誤。 – gopal 2009-06-24 07:59:59

+0

夥計們我嘗試了所有可能的解決方案,但仍然收到此錯誤。我有程序集併成功註冊它們,但仍然出現相同的錯誤。真正需要幫助... – newprogress 2013-12-23 11:39:30

回答

351

在VS - 項目屬性 - 在生成選項卡 ​​- 平臺目標= X86

+8

你剛給我一個無謂的頭痛。 – 2010-10-22 17:09:29

+2

也讓我頭痛。 – 2010-12-03 23:15:25

+5

在VS2008中我發現這個選項在'編譯 - >高級編譯選項...'(在窗口選項卡的底部),然後'目標CPU'(x86) – Rodolfo 2011-06-27 15:56:27

52

這聽起來像您的服務是針對'任何CPU'構建的,導致您在使用COM組件的64位上發生錯誤。你需要建立它爲x86

該網站可能以32位進程運行,這就是爲什麼它可以使用該組件。針對x86構建解決方案將強制您的服務以32位運行。

+0

我也面臨着同樣的problem..here我的桌面應用程序成功安裝在64位system..while做安裝我做同步成功,但是當我從我的軟件做同步它顯示我上面的錯誤 – 2014-03-28 10:42:24

+0

我正在嘗試註冊`.ocx文件(c:\ Windows \ SysWow> RegSvr32 genX.ocx)`但出現錯誤**模塊加載失敗。確保二進制文件存儲在指定的路徑或調試它來檢查二進制文件或相關的.DLL文件的問題。** – 2017-06-15 08:46:02

13

問題是服務器進程是64位,庫是32位,它試圖在同一進程(in-proc服務器)中創建COM組件。要麼重新編譯服務器並將其設置爲32位,要麼保持服務器不變,並使COM組件處於進程外。將COM服務器置於進程外的最簡單方法是創建一個COM +應用程序 - 控制面板 - >管理工具 - > ComponentServices。

49

我遇到了一個非常類似的問題。

我需要在64位機器上開發的Web應用程序中使用舊的32位DLL。我使用該文件夾中的regsrv32版本將32位DLL註冊到windows \ sysWOW64文件夾中。

調用第三方DLL從Visual Studio中的單元測試中工作,但是在80040154錯誤的同一臺機器上IIS中託管的Web應用程序失敗。

將應用程序池更改爲「啓用32位應用程序」解決了該問題。

3

要更改爲86:

  1. 創建您的解決方案安裝項目。
  2. 創建後,轉到解決方案資源管理器,右鍵單擊安裝項目。
    • 按配置管理器。
    • 點擊:「Active Solution Platform」組合框並選擇New(如果沒有顯示x86)
    • 從第一個組合x86中選擇,然後按OK。
    • 重建安裝項目,然後重建所有項目。
5

用於Windows的解決方案2008服務器的x64是:

  1. 開放的cmd.exe有管理員權限。
  2. 複製的dll文件夾C:在C \的Windows \ Syswow64資料
  3. 運行REGSVR32:\ WINDOWS \ SysWOW64中
  4. 驗證DLL是Windows的註冊表。
  5. 如果您有一個使用dll的.exe x86,則該exe文件必須以x86模式編譯。
  6. 的EXE必須安裝在文件夾C:\ Program Files文件(x86)的

這個過程是有效的,它是確定。

3

如果您正在運行網站,還可以嘗試設置應用程序池以禁用32位應用程序(在池的高級設置下)。

5

有一個相關的問題有不同,但類似的解決辦法:

我有一個Windows服務項目設置爲「任何CPU的」使用64位的DLL。相同的錯誤消息。試了一大堆東西,但沒有成功。最後,我進入了項目「屬性」 - >「生成」,並注意到該項目已選中「首選32位」。取消選中此項,不會出現更多錯誤。

我的猜測是,Windows服務期待一個32位的DLL,並且找不到它。

12

如果你正在尋找一種方法,使這項工作而無需重新編譯任何CPU的應用,這裏是另一個潛在的解決方法:

  1. 找到你的COM對象下HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \ {GUID}的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。此密鑰下不需要添加任何值。

我對解決方案沒有信譽,但它對我們有效。檢查來源鏈接以獲取更多信息和其他評論。

來源:http://www.gfi.com/blog/32bit-object-64bit-environment/

12

你不必配置項目屬性的平臺目標X86。 您還可以配置IIS的選項就是那樣的

  • 選擇應用程序池
  • 86的工作選擇,你的應用程序使用
  • 高級設置池
  • 啓用32個應用程序真正
4

我有同樣的問題,但其他的答案只提供解決方案的一個組成部分。

的解決方案是雙重的:

從系統登錄中取出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>

註冊爲32位不刪除64位登記的,不解決我的問題。

5

我沒有改變任何編譯設置。

只需設置「啓用32位應用程序=真」在應用程序池高級設置。

它使用VSTO爲我工作

1

對任何人來說,對我來說,問題是缺少參考office組裝。如果您嘗試手動實例化某些VSTO對象,它也會出現。

0

我的問題是,我在我的項目中引用了錯誤的MS同步框架版本(1.0)。更新到2.1版後,錯誤消失了,生活又恢復了良好。

1

在我個人的情況下,這個問題是固定的搜索類ID在Windows的註冊表開發機器上(因爲這個問題是在客戶端PC拋出)。這個動作將被放置到導致問題的COM組件:在沒有被註冊爲安裝或更新應用程序OCX/COM我的.NET項目中引用一個x86庫。

問候

相關問題