Kayıtlı olmayan COM İstisna Sınıfı nasıl çözülür (HRESULT İstisnası: 0x80040154 (REGDB_E_CLASSNOTREG))?


93

Bir COM sınıfının bir örneğini oluşturmaya çalıştığımda, şu şekilde bir istisna atıyor:

Sınıf kayıtlı değil (HRESULT istisnası: 0x80040154 (REGDB_E_CLASSNOTREG))

Lütfen bunu nasıl çözebileceğimi önerin?


1
Biraz kodla daha fazla ayrıntı verebilir misiniz?
Xaisoft

10
İki soru var: 1. COM bileşenini Windows 7 x64 makineye yüklediniz mi / kaydettirdiniz mi? 2. Uygulamanızın hedef platformu nedir, bence platformu x86 olarak ayarlamalısınız, lütfen "Herhangi bir CPU" olarak ayarlamayın? Lütfen önce
COM'u kaydedin

Yapı hedefini 'x86' olarak değiştirmeden çözdüm. Bağlantıdaki çözüm: < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Yanıtlar:


49

Görünüşe göre, başlatmaya çalıştığınız program veya işlem, makinenizde yüklü değil, hasarlı bir kurulum içeriyor veya kaydedilmesi gerekiyor.

Ya kurun, onarın (Program Ekle / Kaldır aracılığıyla) ya da kaydedin (Regsvr32.exe aracılığıyla).

Size bundan daha fazla yardımcı olabilmemiz için yeterli bilgi sağlamadınız.


4
RegSvr32.exe'yi kastettiğinizi düşünün (RegSrv32.exe'nin aksine).
windowsgm

60

Tüm derlemelerinizin doğru mimari için derlendiğinden emin olmanız gerekir. COM bileşenini yeniden yüklemek işe yaramazsa, x86 mimarisini değiştirmeyi deneyin.


Bu, NAV 2009 R2 İstemcisini (ClassID 50000004-0000-1000-0001-0000836BD2D2) bulamama sürecimi çözdü.
Vincent Vancalbergh

14

Benim sorunum ve çözüm

2008 R2 makinemde kurmuş olduğum 64 bit olan 32 bit üçüncü parti bir dll var.

İşlem için 32 bit üçüncü taraf dll'yi çağıran .net 4.5 çerçevesinde oluşturulmuş bir wcf hizmetim var. Şimdi 'herhangi bir' cpu'yu hedefleyecek şekilde ayarlanan özelliği oluşturdum ve 64 bit makineye konuşlandırdım.

wcf hizmetini çağırmaya çalıştığımda "80040154 Sınıfı kayıtlı değil (HRESULT istisnası: 0x80040154 (REGDB_E_CLASSNOTREG")

Şimdi, com kayıt defteri sorununu izlemek için ProcMon.exe'yi kullandım ve işlemin, girişin olmadığı HKLM \ CLSID ve HKCR \ CLSID'deki kayıt defteri girişini aradığını belirledim.

Microsoft'un 32 bit com bileşenlerini 64 bit makinedeki HKLM \ CLSID, HKCR \ CLSID yollarına kaydetmeyeceğini, bunun yerine girişi HKLM \ Wow6432Node \ CLSID ve HKCR \ Wow6432Node \ CLSID yollarına yerleştireceğini öğrendik.

Artık çakışma, HKLM \ CLSID, HKCR \ CLSID'de kayıt defteri girdisini arayacak olan 64 bit makinede 32 bit işlemi çağırmaya çalışan 64 bitlik işlemdir. Çözüm, 64 bit işlemi HKLM \ Wow6432Node \ CLSID ve HKCR \ Wow6432Node \ CLSID'deki kayıt defteri girişine bakmaya zorlamamız gerektiğidir.

Bu, wcf hizmeti proje özelliklerini 'Herhangi' yerine 'X86' makinesini hedefleyecek şekilde yapılandırarak elde edilebilir.

'X86' sürümünü 2008 R2 sunucusuna dağıttıktan sonra "System.BadImageFormatException: Dosya veya derleme yüklenemedi" sorununu aldı

Bu badimageformatexception çözümünün çözümü, doğru uygulama havuzu için IIS Apppool özelliklerinde 'Enable32bitApplications'ı' True 'olarak ayarlamaktır.


Lütfen birden fazla soruya aynı cevapları göndermeyin. İyi bir yanıt verin, ardından diğer soruları kopya olarak kapatmak için oylayın / işaretleyin. Soru yinelenen bir soru değilse , yanıtlarınızı soruya uyarlayın .
kleopatra

10

Ayrıca, başlatırken sınıf bağlamının bu istisnayı yaratabileceğini unutmayın. INPROC_SERVER olarak kodlanmış bir nesneniz varsa ancak CLSCTX_LOCAL_SERVER olarak CoCreateInstance yapmaya çalışırsanız, bu hatayı da alırsınız.

Nesnenin kayıtlı olduğundan ve CoCreateInstance'ın doğru sınıf bağlamına sahip bir örnek oluşturduğundan emin olmanız gerekir.


Evet, örneğin (yerine ) DesktopWallpaperkullanarak oluşturmaya çalışırsanız , hatayı alırsınız . CLSCTX_INPROCCLSCTX_ALL0x80040154 (REGDB_E_CLASSNOTREG)
user362515

9

IIS üzerindeki bir web uygulamasında 64 bit COM bileşenleri kullanıyorsanız, uygulama havuzunun 32 bit uygulamalara izin vermeyecek şekilde ayarlandığından emin olun ( 32 Bit Uygulamaları Etkinleştir: gelişmiş ayarlarda yanlış )


5

Uygulama Havuzu gelişmiş ayarlarında 32 bit uygulamaları etkinleştirerek çalışmasını sağladım. Uygulama havuzuna sağ tıklayın ve gelişmiş ayarları seçin - 32 bit uygulamaları etkinleştirin. Bu, dışarıdaki birine yardımcı olabilir.


Benim için aynı. 64bit dev makine, 64bit test ve 64 bit canlı sunucuda kullanılan 32bit dll. Dev kutusunda iyi çalıştı. Test ve canlı sunuculara dağıtıldığında, ilgili IIS Uygulama Havuzlarında 32 bit uygulamalara izin verilinceye ve havuzlar yeniden başlatılıncaya kadar başarısız oldu. Ayrıca, "Embed Interop Types" ı (VS'de sorun teşkil eden dll'de bir ayar) kapatmam ve dll'nin gerçekten orijinal formunda sunuculara kopyalandığından emin olmak için "Copy Local" = true olarak ayarlamam gerekiyordu.
cymorg

3

Sınıfı (özellikle CLSID'sini) kaydederek - örneğin buraya bakın .


Ayrıca, sınıfın bir kaydı olması gerekmeyen, makinesine veya sunucusuna yüklenmesi gereken bir nesne olabilir mi?
Xaisoft

@Xaisoft, "kurulum", bahsettiğim MSDN url'sinde olduğu gibi tipik olarak "kayıt" gerektirir.
Alex Martelli

3

benim durumumda

my platform x64

the Dll library(sdk)ve redistributable packagex64

yani

  1. çözüm gezgininde navigate to your project

  2. açık Properties

  3. change the Platform target from AnyCPU to x64

görüntü açıklamasını buraya girin


2

Bu sorunu giderilmiş bu şekilde kayıt oldu COMüzeri regsvr32.

Çağırdığınız COM'un kayıtlı olduğundan emin olun.

Başvurum kullanıyordu xceedcry.dllve ben kaydetmiyordum. Kaydolduktan sonra, uygulama iyi çalıştı.


2

Çözümüm , IIS'deki ilgili uygulama havuzunun gelişmiş ayarlarında " 32-Bit Uygulamaları Etkinleştir " seçeneğini True olarak değiştirmekti .

Uygulama Havuzu

32 bit uygulamaları etkinleştirin


2

Benim durumumda, sınıf düzgün bir şekilde kaydedildi ve HERHANGİ BİR CPU / 64 bit modunda oluşturuldu.

Ancak sınıfı kullanan uygulamanın IIS Uygulama havuzunun 32-bit Uygulamaları Etkinleştir özelliği True olarak ayarlandı .

Uygulama havuzu yapılandırması ile gerçek kayıtlı sınıf arasındaki mimari uyuşmazlığı nedeniyle sınıf bulunamadı.

32-bit Uygulamaları Etkinleştir seçeneğini Yanlış olarak ayarlamak sorunu çözdü. IIS Uygulama Havuzu Ayarları


1

Benim için 64 bit yapı yapılandırması oluşturmam gerekiyordu.


1

MapWinGis kullanırken aynı sorunu yaşadım. Çözümü buldum, visual studio 2015 windows formları üzerinde çalışarak, proyect-> properties-> Build'a sağ tıklayın, konfigürasyonu Tüm konfigürasyonlara ayarlayın ve conbobox "platform target" içinde x64 olarak ayarlayın.


0

COM aracılığıyla bir C ++ istemcisinden .Net derlemesini çağıran bu sorunla karşılaştım. NET derlemesinin bağlı olduğu derlemelerden birinin bulunamadığı ortaya çıktı. Bir süre 1. derlemede neyin yanlış olduğunu anlamaya çalıştım, ama aslında 1. derlemenin bağımlılıklarından biriydi. C ++ istemcisinden CoCreateInstance () çağırırken iki farklı hata aldım. İlki şuydu: REGDB_E_CLASSNOTREG Sınıf kayıtlı değil Ve ikinci deneme şuydu: 0x80131040: Bulunan derlemenin bildirim tanımı derleme başvurusuyla eşleşmiyor.

Bu nedenle montajınızın referanslarının mevcut olup olmadığını kontrol edin. Bunu, dotPeek ile 1. derlemeye göz atarak ve referanslarından birinin eksik olduğunu fark ederek keşfettim. Bağımlılığın doğru sürümünü klasöre yerleştirmek her iki hatayı da çözdü.


0

Ben hedeflememi uygulama derliyordu herhangi CPU ve asıl sorun adobe reader yaşlı yüklendiği ortaya çıktı v10.x için ihtiyaçlarını yükseltme v11.x , bu bu sorunu çözmek ya nasıl yoludur.


0

Bir COM sınıfını, yani çalışma zamanında 'Sınıf kayıtlı olmayan istisna' kullanarak aynı sorunla karşılaştım. Benim için app.config dosyasına gidip 'startup' ve 'supportedRuntime' öğelerini aşağıdaki gibi değiştirerek çözebildim:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Ayrıntılar hakkında daha fazla bilgiyi burada http://stackoverflow.com/questions/1604663/ okuyabilirsiniz.

ve burada https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

Visual Studio 2017 çalıştırdığımı not etmeliyim. Hedef cpu = x86 Embed Interop Type = true (özellikler penceresinde)


0

.Net çerçevesinin dizinine gidin ve ilgili dll'yi Regsvr32.exe beyaz alan dll yolu ile kaydedin .


0

Ben de aynı sorunla karşılaştım. Biraz araştırma yaptıktan sonra benim için düzeltme buldum ve faydalı olabilir. Sorun sadece benim gözlemime göre yeniden kurulumla ilgili değil, aynı zamanda erişim izinlerine de bağlı.

Adım 1: Belirli COM nesnesini onarın.

Adım 2: Bileşen Hizmetleri> Bilgisayarlar> Bilgisayarım> DCOM Yapılandırması> COM nesnenizi seçin> Sağ tıklayın> Özellikler> Güvenlik sekmesi> Erişim İzinleri> Özelleştir'i seçin> DÜZENLE'ye tıklayın> IIS_USER'ı seçin (yoksa tam haklarla oluşturun) ve tamamlayın erişin ve Tamam'ı tıklayın.

Kimlik sekmesine gidin> "Etkileşimli kullanıcı" veya "Bu kullanıcı" seçeneğini seçebilirsiniz> Uygula ve Tamam'ı tıklayın. "Bu kullanıcı" yı seçerseniz, bu sunucuya Yönetici ayrıcalıklı kullanıcı vermemiz gerekir.

Adım 3: IIS Yöneticisi'ni açın> Uygulama Havuzlarını Yeniden Başlatın.

Not: Gerekirse lütfen sunucuyu yeniden başlatın


-1

Burada çözümü bulun, mmc -32 aracını çalıştırın (dcomcfg değil)

32 bit Office içeren 64 bit sistemde şunu deneyin:

Start
Run
mmc -32
File
Add Remove Snap-in
Component Services
Add
OK
Console Root
Component Services
Computers
My Computer
DCOM Config
Microsoft Excel Application

görüntü açıklamasını buraya girin

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.