Bagaimana mengatasi Kelas Pengecualian COM tidak terdaftar (Pengecualian dari HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?

93

Ketika saya mencoba untuk membuat sebuah instance dari kelas COM itu melempar pengecualian sebagai

Kelas tidak terdaftar (Pengecualian dari HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Tolong beri tahu bagaimana saya bisa mengatasinya?

Jaswant Agarwal
sumber
1
Bisakah Anda memberikan lebih banyak detail dengan beberapa kode?
Xaisoft
10
Ada dua pertanyaan: 1. Apakah Anda menginstal / mendaftarkan komponen COM pada mesin Windows 7 x64? 2.Apa platform target aplikasi Anda, saya pikir Anda harus mengatur platform ke x86, tolong jangan setel sebagai "CPU Apa Pun"? Silakan daftarkan COM terlebih dahulu dan kemudian jalankan untuk menguji aplikasi, silakan merujuk ke dokumen: support.microsoft.com/kb/146219 dan Penjelasan penggunaan Regsvr32 dan pesan kesalahan
JackWang
Saya menyelesaikannya tanpa mengubah target build menjadi 'x86'. Solusi di tautan: < stackoverflow.com/a/55513690/11310933 >
Sunil Xtha

Jawaban:

49

Sepertinya program atau proses mana pun yang Anda coba inisialisasi tidak diinstal di komputer Anda, memiliki penginstalan yang rusak, atau perlu didaftarkan.

Instal, perbaiki (melalui Tambah / Hapus Program) atau daftarkan (melalui Regsvr32.exe).

Anda belum memberikan informasi yang cukup bagi kami untuk membantu Anda lebih dari ini.

Jay Riggs
sumber
4
Pikirkan yang Anda maksud RegSvr32.exe (sebagai lawan RegSrv32.exe).
windowsgm
60

Anda perlu memastikan semua rakitan Anda dikompilasi untuk arsitektur yang benar. Coba ubah arsitektur untuk x86 jika menginstal ulang komponen COM tidak berhasil.

Andy Fiedler
sumber
Ini memecahkan proses saya tidak menemukan Klien NAV 2009 R2 (ClassID 50000004-0000-1000-0001-0000836BD2D2).
Vincent Vancalbergh
14

Masalah saya dan solusinya

Saya memiliki dll pihak ketiga 32 bit yang telah saya instal di mesin 2008 R2 yaitu 64 bit.

Saya memiliki layanan wcf yang dibuat dalam kerangka kerja .net 4.5 yang memanggil dll pihak ketiga 32 bit untuk proses. Sekarang saya telah membangun properti yang ditetapkan untuk menargetkan cpu 'any' dan menerapkannya ke mesin 64 bit.

ketika saya mencoba memanggil layanan wcf mendapat kesalahan "80040154 Kelas tidak terdaftar (Pengecualian dari HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"

Sekarang saya menggunakan ProcMon.exe untuk melacak masalah registri com dan mengidentifikasi bahwa proses mencari entri registri di HKLM \ CLSID dan HKCR \ CLSID di mana tidak ada entri.

Datang untuk mengetahui bahwa Microsoft tidak akan mendaftarkan komponen com 32 bit ke jalur HKLM \ CLSID, HKCR \ CLSID di mesin 64 bit melainkan menempatkan entri di jalur HKLM \ Wow6432Node \ CLSID dan HKCR \ Wow6432Node \ CLSID.

Sekarang konfliknya adalah proses 64 bit mencoba memanggil proses 32 bit di mesin 64 bit yang akan mencari entri registri di HKLM \ CLSID, HKCR \ CLSID. Solusinya adalah kita harus memaksa proses 64 bit untuk melihat entri registri di HKLM \ Wow6432Node \ CLSID dan HKCR \ Wow6432Node \ CLSID.

Ini dapat dicapai dengan mengkonfigurasi properti proyek layanan wcf untuk menargetkan mesin 'X86', bukan 'Any'.

Setelah menyebarkan versi 'X86' ke server 2008 R2 mendapat masalah "System.BadImageFormatException: Tidak dapat memuat file atau perakitan"

Solusi untuk badimageformatexception ini adalah mengatur 'Enable32bitApplications' menjadi 'True' di properti IIS Apppool untuk apppool yang tepat.

Waheed
sumber
Harap jangan memposting jawaban yang identik untuk beberapa pertanyaan. Posting satu jawaban bagus, lalu pilih / tandai untuk menutup pertanyaan lain sebagai duplikat. Jika pertanyaannya bukan duplikat, sesuaikan jawaban Anda dengan pertanyaan tersebut .
kleopatra
10

Perhatikan juga bahwa konteks kelas saat menginisialisasi dapat membuat pengecualian tersebut. Jika Anda memiliki objek yang dikodekan sebagai INPROC_SERVER tetapi Anda mencoba CoCreateInstance sebagai CLSCTX_LOCAL_SERVER, Anda juga akan mendapatkan kesalahan itu.

Anda perlu memastikan objek terdaftar dan CoCreateInstance membuat sebuah instance dengan konteks kelas yang benar.

Andrew Keith
sumber
Ya, jika misalnya Anda mencoba membuat DesktopWallpapermenggunakan CLSCTX_INPROC(bukan CLSCTX_ALL) Anda akan mendapatkan 0x80040154 (REGDB_E_CLASSNOTREG)kesalahan.
pengguna362515
9

Jika Anda menggunakan komponen COM 64-bit dalam aplikasi web di IIS, pastikan pool aplikasi diatur untuk tidak mengizinkan aplikasi 32 bit ( Aktifkan Aplikasi 32-Bit: salah dalam pengaturan lanjutan)

Matsen75
sumber
5

Saya membuatnya berfungsi dengan Mengaktifkan aplikasi 32 bit di pengaturan lanjutan Pool Aplikasi. Klik kanan pada pool aplikasi dan pilih pengaturan lanjutan - aktifkan aplikasi 32 bit. Ini dapat membantu seseorang di luar sana.

Yoky
sumber
Sama untuk ku. Sebuah dll 32bit digunakan pada mesin dev 64bit, pengujian 64bit dan server live 64 bit. Bekerja dengan baik di kotak dev. Ketika diterapkan ke pengujian dan server langsung, itu gagal hingga aplikasi 32-bit diizinkan di masing-masing IIS App Pools dan pool dimulai ulang. Saya juga harus mematikan "Sematkan Jenis Interop" (pengaturan pada dll menyinggung di VS) dan mengatur "Salin Lokal" = true untuk memastikan dll benar-benar disalin dalam bentuk aslinya ke server.
cymorg
3

Dengan mendaftarkan kelas (khususnya CLSID-nya) - lihat misalnya di sini .

Alex Martelli
sumber
Mungkinkah juga beberapa objek yang perlu diinstal di mesin atau servernya, belum tentu merupakan pendaftaran kelas.
Xaisoft
@Xaisoft, "instalasi" biasanya melibatkan "pendaftaran", seperti url MSDN yang saya sebutkan.
Alex Martelli
3

dalam kasus saya

my platform adalah x64

the Dll library(sdk)dan redistributable packageadalah x64

begitu

  1. di penelusur solusi navigate to your project

  2. Buka Properties

  3. change the Platform target from AnyCPU to x64

masukkan deskripsi gambar di sini

Basheer AL-MOMANI
sumber
2

Cara saya menyelesaikan masalah ini adalah dengan mendaftarkan COMmelalui regsvr32.

pastikan bahwa COM yang Anda panggil terdaftar.

Aplikasi saya sedang menggunakan xceedcry.dlldan saya tidak mendaftarkannya. Setelah saya mendaftarkannya, aplikasi berfungsi dengan baik.

CesarB
sumber
2

Solusi saya adalah mengubah " Aktifkan Aplikasi 32-Bit " ke True dalam pengaturan lanjutan dari kumpulan aplikasi relatif di IIS.

App Pool

Aktifkan aplikasi 32 bit

Adrian
sumber
2

Dalam kasus saya, kelas terdaftar dengan benar dan dibangun dalam mode CPU / 64 bit APAPUN .

Tetapi properti Aktifkan Aplikasi 32-bit dari kumpulan Aplikasi IIS dari aplikasi yang menggunakan kelas telah disetel ke True .

Kelas tidak ditemukan karena ketidaksesuaian arsitektur antara konfigurasi kumpulan aplikasi dan kelas terdaftar yang sebenarnya.

Pengaturan Enable 32-bit Applications to False memperbaiki masalah ini. Pengaturan IIS App Pool

Bhupinderjit Dhanoa
sumber
1

Bagi saya, saya harus membuat konfigurasi build 64 bit.

jbooker
sumber
1

Saya memiliki masalah yang sama saat menggunakan MapWinGis. Saya menemukan solusinya, bekerja pada visual studio 2015 windows forms proyect, cukup klik kanan pada proyect-> properties-> Build, setel konfigurasi ke All configuration dan di conbobox "platform target" atur ke x64.

Deydra A
sumber
0

Saya mengalami masalah ini memanggil rakitan .Net dari klien C ++ melalui COM. Ternyata salah satu rakitan tempat perakitan .Net bergantung tidak dapat ditemukan. Saya bergumul sebentar mencoba mencari tahu apa yang salah dengan rakitan pertama, tetapi itu sebenarnya salah satu dependensi rakitan pertama. Saya menerima dua kesalahan berbeda saat memanggil CoCreateInstance () dari klien C ++. Yang pertama adalah: REGDB_E_CLASSNOTREG Kelas tidak terdaftar Dan percobaan kedua adalah: 0x80131040: Definisi manifes rakitan yang terletak tidak cocok dengan referensi rakitan.

Jadi periksa apakah referensi majelis Anda ada. Saya menemukan ini dengan menjelajahi perakitan pertama dengan dotPeek dan memperhatikan salah satu referensinya hilang. Menempatkan versi yang benar dari ketergantungan di folder menyelesaikan kedua kesalahan.

Sean B
sumber
0

Saya sedang menyusun aplikasi saya yang menargetkan CPU apa pun dan masalah utama ternyata adobe reader diinstal v10.x lama perlu memutakhirkan v11.x , ini adalah cara saya menyelesaikan masalah ini.

Anjan Kant
sumber
0

Saya mengalami masalah yang sama menggunakan kelas COM, yaitu 'Kelas tidak pengecualian terdaftar' pada saat runtime. Bagi saya, saya bisa menyelesaikannya dengan membuka file app.config dan mengubah elemen 'startup' dan 'supportRuntime' menjadi sesuatu seperti:

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

Anda dapat membaca lebih lanjut tentang detailnya di sini http://stackoverflow.com/questions/1604663/

dan di sini https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

Saya harus mencatat bahwa saya menjalankan Visual Studio 2017. Target cpu = x86 Embed Interop Type = true (di jendela properti)

Joseph Mawer
sumber
0

Buka direktori .NET framework dan daftarkan dll masing-masing dengan jalur dll spasi putih Regsvr32.exe .

Muhammad Saeed
sumber
0

Saya menghadapi masalah yang sama. Setelah melakukan beberapa penelitian saya menemukan perbaikan untuk saya dan semoga bermanfaat. Masalahnya tidak hanya terkait dengan instalasi ulang seperti pengamatan saya, itu tergantung pada izin akses juga.

Langkah 1: Perbaiki objek COM tertentu.

Langkah 2: Layanan Komponen> Komputer> Komputer Saya> Konfigurasi DCOM> Pilih objek COM Anda> Klik kanan> Properti> tab Keamanan> Izin Akses> Pilih Kustomisasi> Klik EDIT> Pilih IIS_USER (Jika tidak ada, buat dengan hak lengkap) dan berikan lengkap akses dan klik OK.

Pindah ke tab Identity> Anda dapat memilih "Pengguna interaktif" atau "Pengguna ini"> Klik Terapkan dan OK. Jika Anda memilih "Pengguna ini", kami harus memberikan pengguna dengan hak Administratif ke server itu

Langkah 3: Buka Manajer IIS> Mulai Ulang Kumpulan Aplikasi.

Catatan: Jika diperlukan, silakan restart server

Pavan Kumar Vempati
sumber
-1

Di sini temukan solusinya, jalankan alat mmc -32 (bukan dcomcfg)

Pada sistem 64 bit dengan Office 32 bit, coba ini:

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

masukkan deskripsi gambar di sini

Martín Martínez
sumber