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?
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?
Yanıtlar:
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.
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.
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.
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.
DesktopWallpaper
kullanarak oluşturmaya çalışırsanız , hatayı alırsınız . CLSCTX_INPROC
CLSCTX_ALL
0x80040154 (REGDB_E_CLASSNOTREG)
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.
Sınıfı (özellikle CLSID'sini) kaydederek - örneğin buraya bakın .
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ü.
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ü.
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.
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)
.Net çerçevesinin dizinine gidin ve ilgili dll'yi Regsvr32.exe beyaz alan dll yolu ile kaydedin .
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
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