{XXXX} CLSID bileşenine sahip COM sınıfı fabrikası alınamadığı için aşağıdaki hata oluştu: 80040154


278

PDF raporu oluşturmak için C # .NET kullanarak bir Windows hizmeti geliştirdim. PDF dosyası oluşturmak için bir üçüncü taraf dll kullanıyorum. Uygulama Windows XP platformumda çalışıyor. Hizmeti Windows Server 2008 64 bit sürümünde dağıttığımda şu hatayı aldım:

CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} olan bileşen için COM sınıfı fabrikasını alma, aşağıdaki hata nedeniyle başarısız oldu: 80040154.

Regsvr32 komutunu kullanarak DLL'yi kaydettirdim. Bu CLSID'i kayıt defterinde görebiliyorum. Ama sorun devam ediyor.

Sorun ne olabilir?


1
Aynı sunucuda barındırılan bir web uygulaması hatasız PDF dosyası oluşturabilir.
gopal

Çocuklar olası her çözümü denedim ama yine de bu hatayı alıyorum. Montajlarım var ve bunları başarıyla kaydettim ama yine de aynı hatayı alıyorum. Gerçekten yardıma ihtiyacım var ...
newprogress

Yanıtlar:


383

VS'de - proje özellikleri - Oluştur sekmesinde - platform hedefi = X86


7
VS2008'de bu seçeneği 'Derleme-> Gelişmiş Derleme Seçenekleri ...' nin altında (pencere sekmesinin altında) ve sonra 'Hedef CPU' (x86)
Rodolfo

1
+1'den fazlasını hak ediyorsunuz, ancak +1 vermek zorunda olduğum tek şey
David

7
Bu her zaman çözüm değildir.

2
Beni yedi deniz bankası hesabı, bir sosisli sandviç standı ve evliliğimden kurtardın. Teşekkür ederim
Donald. Kayıt

2
Aynı hata iletisine sahibim ama bu çözüm benim için çalışmıyor.
Akram Khan

59

Çok benzer bir sorunla karşılaştım.

64-bit bir makinede geliştirilen bir Web Uygulaması içinde eski bir 32-bit DLL kullanmak gerekiyordu. 32-bit DLL dosyasını o klasördeki regsrv32 sürümünü kullanarak windows \ sysWOW64 klasörüne kaydettirdim.

Üçüncü taraf DLL çağrıları Visual Studio'daki birim sınamalardan çalıştı, ancak 80040154 hatasıyla aynı makinede IIS'de barındırılan Web Uygulamasından başarısız oldu.

Uygulama havuzunu "32 Bit Uygulamaları Etkinleştir" olarak değiştirmek sorunu çözdü.


1
Bu sorunu gidermek için bulduğum en kolay yol budur. Teşekkürler!
dexter

6
Bu yanıtı gerçekten çok seviyorum. Bir noktada sadece bir küçük 32-bit DLL çağırdığınızda x86 için bir web sitesinin tamamını derlemenin bir anlamı yoktur.
DanM7

@Daniel Ballinger Uygulamam değişikliği yaparken 32 bit işlem olarak çalışır mı?
Acemi

@Danny SysWOW64'e kaydettiğim DLL'ye erişemeyeceği için inanmıyorum.
Daniel Ballinger

1
Ben de aynı sorun var, ama ben nasıl yapmalıyım, uygulama havuzu değiştirmek için nasıl bilmiyorum, plz bana yardım et
Shima.Y

58

Hizmetiniz 'Herhangi bir CPU'ya karşı oluşturulmuş gibi geliyor ve COM bileşenlerini kullandığınız 64 bitte hatalara neden oluyor. Bunun için inşa etmelisin x86.

Web sitesi muhtemelen 32-bit bir süreç olarak çalışıyor, bu yüzden bileşeni kullanabilir. Çözümünüzü oluşturmak x86, hizmetinizi 32 bit olarak çalışmaya zorlar.


Ayrıca aynı sorunla karşı karşıyayım ... Masaüstü uygulamam 64bit sisteme başarıyla yüklendi ... kurulum yaparken senkronizasyonu başarılı bir şekilde yaptım, ancak yazılımımdan senkronizasyon yaptığımda hatayı yukarıda gösteriyor
Mohini Mhetre

Kayıt olmaya çalışıyorum .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)ama hata alıyorum Modül yüklenemedi. İkili dosyanın belirtilen yolda depolandığından emin olun veya ikili veya bağımlı .DLL dosyalarıyla ilgili sorunları kontrol etmek için hata ayıklayın.
Naveen Kumar

Ve 32 bit olarak derlenmişse, SysWow64 sürümü değil, Sistem regsvr32 kullanılmalıdır.
Fandango68

SSIS paketini çalıştırırken bu hatayı alıyorum. Bağlantılar iyi çalışıyor. Tüm özellikler doğrudur. Aslında SSIS paketi aylardır sorunsuz bir şekilde çalışıyordu. Aniden hata alıyorum. Çalışma zamanını değiştirmeyi denedim / x64'ten x86'ya hata ayıklama sorunu hala çözülmedi.
IamVISH

16

X86 proje özellikleri platform hedefinizi yapılandırmanız gerekmez. Ayrıca iis seçeneklerini x86 ile çalışacak şekilde yapılandırabilirsiniz

  • Uygulama havuzunu seçin
  • Uygulamanızın kullandığı havuzu seçin
  • Gelişmiş Ayarlar
  • 32 bit uygulamaları doğru etkinleştir

Bu benim için her zaman doğrudur. Platform hedefini asla X86 olarak ayarlamak zorunda kalmadım, ancak her zaman • 32 Bit Uygulamaları Etkinleştir = Doğru • Kimlik Ayarla = ApplicationPoolIdentity • Kullanıcı Profilini Yükle = Doğru
Zath.

Ben Nazim talimatları göre düzeltildi ama aynı zamanda "Birlikte Çalışma Türleri Embed" (başvurulan dll bir özelliği) ve Kopya Yerel = true ayarlamak zorunda benzer bir sorun vardı.
cymorg

"Uygulama Havuzu'nu nasıl seçersiniz"?
CodyBugstein

Uygulama Havuzları menüsü soldaki iis menüsü listesindedir
nazim hatipoğlu

16

Herhangi bir CPU uygulamanızı yeniden derlemeden bu işi yapmanın bir yolunu arıyorsanız, başka bir potansiyel çözüm aşağıdadır:

  1. HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID} altında COM nesnesi GUID'inizi bulun
  2. Yerleştirildikten sonra yeni bir REG_SZ (dize) Değeri ekleyin. Ad AppID olmalı ve veriler yeni aradığınız COM nesnesi GUID'si olmalıdır
  3. HKey_Classes_Root \ Wow6432Node \ AppID altına yeni bir anahtar ekleyin. Yeni anahtar, COM nesnesi GUID'si ile aynı olarak adlandırılmalıdır.
  4. Yeni eklediğiniz anahtarın altına yeni bir Dize Değeri ekleyin ve DllSurrogate deyin. Değeri boş bırakın.
  5. HKey_Local_Machine \ Software \ Classes \ AppID \ altında yeni bir Anahtar oluşturun. Yine yeni anahtar COM nesnesinin GUID'si ile aynı olarak adlandırılmalıdır. Bu anahtarın altına değer eklenmesine gerek yoktur.

Çözüm için kredi almıyorum, ama bizim için işe yaradı. Daha fazla bilgi ve diğer yorumlar için kaynak bağlantısına bakın.

Kaynak: https://techtalk.gfi.com/32bit-object-64bit-environment/


1
En mükemmel talimatlar. Yapım platformunu değiştirememe izin veren üçüncü taraf bir araç kullanıyordum. Bu çözüm bu sorunu atlattı. Teşekkür ederim!

Adım 1'de açıklandığı gibi anahtarı buldum ve sonra hangi COM nesnesinin sorun çıkardığını biliyordum, sonra sadece regsvr32'yi çalıştırıyorum. Çok teşekkürler!
MichaelS

Bunu yaptığımda yerel web sunucum (IIS) erişime izin verilmedi. Bu bana bunun doğru yönde atılmış bir adım olduğunu söylüyor ama bu noktada kime erişim vereceğinden emin değilim. stackoverflow.com/questions/14019401/…
user420667

14

Sorun, sunucu işleminin 64 bit ve kitaplığın 32 bit olması ve aynı süreçte COM bileşenini oluşturmaya çalışmasıdır (proc sunucuda). Sunucuyu yeniden derleyip 32 bit hale getirirsiniz veya sunucuyu değiştirmeden bırakırsınız ve COM bileşenini işlem dışı bırakırsınız. Bir COM sunucusunu işlem dışı hale getirmenin en kolay yolu bir COM + uygulaması - Denetim Masası -> Yönetimsel Araçlar -> Bileşen Hizmetleri oluşturmaktır.


Bir COM + uygulaması oluşturmaya çalışırken bir hatayla karşılaştım. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee

8

Herhangi bir derleme ayarını değiştirmedim.

AppPool Gelişmiş Ayarlarında "32 bit Uygulamayı Etkinleştir = Doğru" ayarlamanız yeterlidir.

Benim için çalıştı


1
AppPool Gelişmiş Ayarları nerede?
CodyBugstein

7

Windows 2008 Server X64 için çözüm:

  1. cmd.exe dosyasını Yönetici izniyle açın.
  2. Dll'yi C: \ Windows \ SysWOW64 klasörüne kopyalayın
  3. regsvr32'yi C: \ Windows \ SysWOW64 dizininden çalıştırın
  4. Dll'nin Windows kayıt defterinde olduğunu doğrulayın.
  5. Dll kullanan bir .exe x86 varsa, exe x86 modunda derlenmiş olmalıdır.
  6. Exe, C: \ Program Files (x86) klasörüne kurulmalıdır.

Bu prosedür geçerlidir, tamamdır.


6

Aynı sorunu yaşadım, ancak diğer cevaplar çözümün sadece bir kısmını sağladı.

Çözüm iki kattır:

64bit kayıt defterinden kaldırın.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Bu, diğer klasörlerde dll kopyalanan diğer başvuruları kaldırmaz.

veya

  • HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32 adlı anahtarı bulun. Bu anahtar, varsayılan değer olarak DLL dosya adına sahip olacaktır.
  • HKEY_CLASSES_ROOT \ CLSID {......} klasörünü kaldırdım.

32bit olarak kaydedin:

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

64bit kaydını kaldırmadan 32bit olarak kaydetmek sorunumu çözmez.


Bingo! Aradığım cevap buydu (başka bir yerde yorumlarıma bakın). Teşekkürler!
Fandango68

5

Farklı, ancak benzer bir düzeltmeyle ilgili bir sorun vardı:

64-bit DLL kullanarak "Any-CPU" olarak ayarlanmış bir Windows hizmet projesi vardı. Aynı hata mesajı. Bir sürü şey denedim, ama hiçbir şey işe yaramadı. Son olarak, proje Özellikleri -> Derleme'ye girdim ve projenin "32 bit tercih et" i işaretlediğini fark ettim. Bu seçeneğin işareti kaldırıldı ve başka hata yok.

Benim tahminim, Windows hizmeti 32 bit DLL bekliyordum ve bulamadım.


Bu garip olmasına rağmen işe yarıyor !! Teşekkür ederim
FindOutIslamNow

3

X86 olarak değiştirmek için:

  1. Çözümünüz için bir kurulum projesi oluşturun.
  2. Oluşturduktan sonra, Solution Explorer'a gidin, kurulum projesine sağ tıklayın.
    • Configuration Manager tuşuna basın.
    • Tıklayın: "Aktif Çözüm Platformu" birleşik giriş kutusu ve Yeni'yi seçin (x86 görüntülenmiyorsa)
    • İlk açılan x86 arasından seçim yapın, ardından OK tuşuna basın.
    • Kurulum projesini yeniden oluşturun, ardından Tüm projeyi yeniden oluşturun.

3

Bir web sitesi çalıştırıyorsanız, uygulama havuzunuzu 32 bit Uygulamaları devre dışı bırakacak şekilde ayarlamayı deneyebilirsiniz (bir havuzun gelişmiş ayarları altında).


2
Bunun tersini yaptım ve 32 bit uygulamaları etkinleştirmem gerekiyordu.
row1

2

Kişisel durumumda, sorun geliştirici makinesindeki Windows Kayıt Defteri'nde sınıf kimliğinin aranmasıyla düzeltildi (çünkü sorun bir istemci PC'ye atıldı). Bu eylem, soruna neden olan COM bileşenine yerleştirilir: .NET projemde başvurulan yükleyici veya güncelleştirici uygulaması için OCX / COM olarak kaydedilmemiş bir x86 kitaplığı .

Saygılarımızla


1

VSTO kullanan herkes için, benim için sorun officemeclise eksik bir referanstı . Belirli VSTO nesnelerini manuel olarak başlatmaya çalışıyorsanız da görünecektir.


1

DLL gerçek kayıt ile ilgili benim sorunum bulundu.

Önce bir CMD isteminden "Regedit.exe" komutunu çalıştırın (güvenlik düzeyini Administrator'a, "her ihtimale karşı" olarak yükselttim), sonra Kayıt Defteri'nde arama yapın (RegEdit menüsünde "Düzenle / Bul" u tıklayarak veya Ctrl + F tuşlarına basarak) COM sınıfı fabrikasıyla ilgili olarak aldığınız hata iletisinde gösterilen CLSID için. CLSID'im 29AB7A12-B531-450E-8F7A-EA94C2F3C05F idi. Bu anahtar bulunduğunda, o Hive düğümü altında "InProcServer2" alt anahtarını seçin ve sağ DLL Regedit çerçevesindeki sorun DLL dosya adını belirleyin. "Varsayılan" altında gösteriliyor. Bu dosya "C: \ Windows \ SysWow64" (C: \ Windows \ SysWow64 \ Redemption.dll "gibi) klasöründe bulunuyorsa," C: \ Windows \ SysWow64 \ RegSvr32.exe "dosyasını kullanmanız önemlidir. bu DLL komut satırından kaydedin ve varsayılan "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll tuşuna basın. Yakın ardından "Çıkış" üzerinden komut penceresi ( yeniden başlatın bilgisayarınızı (her zaman yeniden başlatma kullanmak yerine yakın Down "Shut Down" ve Power-Up oysa bir yeniden yükler aşağı ve her şeyin yeniden (garip) Yeniden ayrıntılı bir kapalı gerçekleştirmek beri sonra, başlangıç saklanan sürücülerin ve diğer değerlerin önbelleği (hatalı olabilir) Gelecekte bir DLL kaydettiğinizde, C: \ Windows \ SysWow64 klasöründe depolanan herhangi bir DLL ve bu sorun için SysWow64 "RegSvr32.exe" kullanmayı unutmayın. (yanlış kayıttan kaynaklanıyorsa) tekrar olmamalıdır.


Büyük ipucu, ama sadece SysWow64 32bit DLL kaydetme o zaman DLL 64 bit istekleri işlemek için bir sarıcı olduğunu varsayalım unutmayın.
Fandango68

0

Benim sorunum, benim proje başvurular yanlış MS Sync FrameWork sürüm (1.0) vardı. 2.1 sürümü güncellemesinden sonra hata giderildi ve hayat tekrar iyi.


0

Benim durumumda, ben gibi ms ofis dosyası üreten ediyorum wordya excel, ben çalıştırmak Win+Rve yürütmek dcomcnfg, DCOM Yapılandırması (isim içeriyor gibi seçkin OFİS ilgili isim öğesi yanında Excelya Wordya Office) ve Open the properties, select Identity tab and select the interactive user.olarak bu cevap ,

Hata mesajım gösteriliyor CLSID {000209FF-0000-0000-C000-000000000046}, bu yüzden DCOM Config'de bu belirli CLSID'yi bulmaya çalışmalıyım ve exsits yapıyor ve onu seçiyorum ve aynı adımı takip eden seti izledikten interactive usersonra çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.