Mengambil pabrik kelas COM untuk komponen dengan CLSID {XXXX} gagal karena kesalahan berikut: 80040154

278

Saya mengembangkan layanan Windows menggunakan C # .NET untuk menghasilkan laporan PDF. Untuk menghasilkan file PDF saya menggunakan dll pihak ketiga. Aplikasi sedang berjalan di platform Windows XP saya. Ketika saya menggunakan layanan di Windows Server 2008 versi 64 bit, saya mendapat kesalahan ini:

Mengambil pabrik kelas COM untuk komponen dengan CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} gagal karena kesalahan berikut: 80040154.

Saya mendaftarkan DLL menggunakan perintah regsvr32. Saya dapat melihat CLSID ini di registri. Tapi masalahnya tetap ada.

Apa yang bisa menjadi masalah?

gopal
sumber
1
Aplikasi web yang dihosting di server yang sama dapat menghasilkan file PDF tanpa kesalahan.
gopal.
Guys Saya mencoba setiap solusi yang mungkin tetapi masih mendapatkan kesalahan ini. Saya memiliki majelis dan mendaftarkannya dengan sukses tetapi masih mendapatkan kesalahan yang sama. Benar-benar butuh bantuan ...
kemajuan baru

Jawaban:

383

Dalam VS - properti proyek - di tab Bangun - target platform = X86

Fabrice MARIANADIN
sumber
7
di VS2008 saya menemukan opsi ini di bawah 'Kompilasi-> Opsi Kompilasi Lanjutan ...' (di bagian bawah tab jendela) dan kemudian 'CPU Target' (x86)
Rodolfo
1
Anda berhak mendapatkan lebih dari +1 tetapi +1 adalah yang harus saya berikan
David
7
Ini tidak selalu solusinya.
2
Anda telah menyelamatkan saya tujuh rekening bank luar negeri, kios hot dog, dan pernikahan saya. Terima kasih
Donald. Rekaman
2
Saya memiliki pesan kesalahan yang sama tetapi solusi ini tidak berfungsi untuk saya.
Akram Khan
59

Saya mengalami masalah yang sangat mirip.

Saya perlu menggunakan DLL 32-bit lama dalam Aplikasi Web yang sedang dikembangkan pada mesin 64-bit. Saya mendaftarkan DLL 32-bit ke folder windows \ sysWOW64 menggunakan versi regsrv32 di folder itu.

Panggilan ke DLL pihak ketiga bekerja dari unit test di Visual Studio tetapi gagal dari Aplikasi Web yang di-host di IIS pada mesin yang sama dengan kesalahan 80040154.

Mengubah kumpulan aplikasi ke "Aktifkan Aplikasi 32-Bit" menyelesaikan masalah.

Daniel Ballinger
sumber
1
Ini adalah cara termudah yang saya temukan untuk memperbaiki masalah ini. Terima kasih!
dexter
6
Saya sangat suka jawaban ini. Tidak ada gunanya mengkompilasi seluruh situs web untuk x86 ketika Anda hanya memanggil satu DLL 32-bit kecil di beberapa titik.
DanM7
@Daniel Ballinger Apakah aplikasi saya berjalan sebagai proses 32 bit untuk melakukan perubahan?
Novis
@ Danny saya tidak percaya begitu, karena tidak akan dapat mengakses DLL saya mendaftar ke sysWOW64.
Daniel Ballinger
1
Saya memiliki masalah yang sama, tetapi saya tidak tahu bagaimana cara mengganti kumpulan aplikasi, di mana saya harus melakukan ini, tolong bantu saya
Shima.Y
58

Kedengarannya seperti layanan Anda dibangun terhadap 'Any CPU', menyebabkan Anda kesalahan pada 64-bit di mana Anda menggunakan komponen COM. Anda perlu membuatnyax86 .

Situs web ini mungkin berjalan sebagai proses 32-bit yang karenanya dapat menggunakan komponen. Membangun solusi Anda melawan x86akan memaksa layanan Anda berjalan sebagai 32-bit.

stevehipwell
sumber
Saya juga menghadapi masalah yang sama..di sini aplikasi desktop saya berhasil diinstal pada sistem 64bit..saat melakukan instalasi saya berhasil melakukan sinkronisasi tetapi ketika saya melakukan sinkronisasi dari perangkat lunak saya itu menunjukkan kesalahan di atas
Mohini Mhetre
Saya mencoba mendaftar .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)tetapi mendapatkan kesalahan . Modul gagal dimuat. Pastikan biner disimpan di jalur yang ditentukan atau debug untuk memeriksa masalah dengan file .DLL biner atau dependen.
Naveen Kumar
Dan jika itu dikompilasi sebagai 32-bit, maka System regsvr32 harus digunakan, bukan versi SysWow64.
Fandango68
Saya mendapatkan kesalahan ini saat menjalankan paket SSIS. Koneksi berfungsi dengan baik. Semua properti benar. Sebenarnya paket SSIS sudah berjalan sejak berbulan-bulan tanpa kesalahan. Tiba-tiba saya mendapatkan kesalahan di atas. Saya mencoba mengubah runtime / debugging ke x86 dari x64 masih masalah belum terselesaikan.
IamVISH
16

Anda tidak perlu mengkonfigurasi target platform properti proyek Anda X86. Anda juga dapat mengonfigurasi opsi iis untuk bekerja dengan x86 seperti itu

  • Pilih kumpulan aplikasi
  • Pilih kumpulan yang digunakan aplikasi Anda
  • Pengaturan lanjutan
  • Aktifkan aplikasi 32 bit benar
nazim hatipoglu
sumber
Ini selalu benar bagi saya. Tidak pernah harus menetapkan target platform ke X86 tetapi selalu • Mengaktifkan Aplikasi 32-Bit = True • Atur Identity = ApplicationPoolIdentity • Muat Profil Pengguna = True
Zath.
Saya memiliki masalah serupa yang diperbaiki sesuai instruksi Nazim tetapi juga tidak boleh "Embed Interop Types" (properti dll yang direferensikan) dan mengatur Copy Local = true.
cymorg
Bagaimana Anda "Pilih Application Pool"?
CodyBugstein
Menu Aplikasi Pools ada di daftar menu iis di sebelah kiri
nazim hatipoglu
16

Jika Anda mencari cara untuk membuat ini berfungsi tanpa mengkompilasi ulang aplikasi Any CPU Anda, berikut adalah solusi lain yang potensial:

  1. Temukan GUID objek COM Anda di bawah HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Setelah ditemukan tambahkan Nilai REG_SZ (string) baru. Nama harus AppID dan data harus GUID objek COM yang sama dengan yang baru saja Anda cari
  3. Tambahkan kunci baru di bawah HKey_Classes_Root \ Wow6432Node \ AppID. Kunci baru harus disebut sama dengan objek COM GUID.
  4. Di bawah kunci baru yang baru saja Anda tambahkan, tambahkan Nilai String baru, dan beri nama DllSurrogate. Biarkan nilainya kosong.
  5. Buat Kunci baru di bawah HKey_Local_Machine \ Software \ Classes \ AppID \ Sekali lagi kunci baru harus disebut sama dengan GUID objek COM. Tidak ada nilai yang perlu ditambahkan di bawah kunci ini.

Saya tidak mengambil kredit untuk solusinya, tetapi itu berhasil bagi kami. Periksa tautan sumber untuk informasi lebih lanjut dan komentar lainnya.

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

Joshua Starner
sumber
1
Instruksi paling bagus. Saya menggunakan alat pihak ketiga, membuat saya tidak dapat mengubah platform build. Solusi ini menghindari masalah itu. Terima kasih!
Saya telah menemukan kunci seperti yang Anda jelaskan di langkah 1, dan kemudian saya tahu objek COM mana yang membuat masalah, maka saya jalankan regsvr32 di atasnya. Terima kasih banyak!
MichaelS
Ketika saya melakukan ini, server web lokal saya (IIS) mulai mendapatkan akses ditolak. Ini memberitahu saya bahwa ini adalah langkah ke arah yang benar, tetapi saya tidak yakin kepada siapa harus memberikan akses pada saat ini. stackoverflow.com/questions/14019401/…
user420667
14

Masalahnya adalah proses server 64 bit dan pustaka 32-bit dan mencoba untuk membuat komponen COM dalam proses yang sama (server in-proc). Entah Anda mengkompilasi ulang server dan membuatnya 32-bit atau Anda membiarkan server tidak berubah dan membuat komponen COM keluar dari proses. Cara termudah untuk membuat server COM keluar dari proses adalah membuat aplikasi COM + - Control Panel -> Administrative Tools -> ComponentServices.

sharptooth
sumber
Saya mengalami kesalahan saat mencoba membuat aplikasi COM +. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee
8

Saya tidak mengubah pengaturan kompilasi.

Cukup atur "Enable 32-bit Application = True" di AppPool Advanced Settings.

Ini berhasil untuk saya

Eduardo Xavier
sumber
1
Di mana Pengaturan Lanjutan AppPool?
CodyBugstein
7

Solusi untuk windows 2008 server x64 adalah:

  1. buka cmd.exe dengan izin Administrator.
  2. Salin dll ke folder C: \ Windows \ SysWOW64
  3. jalankan regsvr32 dari C: \ Windows \ SysWOW64
  4. Verifikasi bahwa dll ada dalam registri Windows.
  5. Jika Anda memiliki .exe x86 yang menggunakan dll, exe harus dikompilasi dalam mode x86.
  6. Exe harus diinstal di folder C: \ Program Files (x86)

Prosedur ini valid, tidak apa-apa.

Juan
sumber
6

Saya memiliki masalah yang sama, tetapi jawaban yang lain hanya memberikan satu bagian dari solusi.

Solusinya dua kali lipat:

Hapus 64bit dari Registery.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Ini tidak akan menghapus referensi ke salinan dll di folder lain.

atau

  • Temukan kunci yang disebut HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Kunci ini akan memiliki nama file DLL sebagai nilai default.
  • Saya menghapus folder HKEY_CLASSES_ROOT \ CLSID {......}.

Daftarkan sebagai 32bit:

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

Mendaftarkannya sebagai 32bit tanpa menghapus pendaftaran 64bit tidak menyelesaikan masalah saya.

Gerhard Powell
sumber
Bingo! Itulah jawaban yang saya cari (lihat komentar saya di tempat lain). Terima kasih!
Fandango68
5

Punya masalah terkait dengan perbaikan yang berbeda, namun serupa:

Saya memiliki proyek layanan Windows yang diatur ke "Any-CPU" menggunakan DLL 64-bit. Pesan kesalahan yang sama. Sudah mencoba banyak hal, tetapi tidak ada yang berhasil. Akhirnya, saya masuk ke proyek Properties -> Build dan perhatikan bahwa proyek telah "Lebih suka 32-bit" diperiksa. Hapus centang ini dan tidak ada lagi kesalahan.

Dugaan saya adalah bahwa layanan windows mengharapkan DLL 32-bit, dan tidak dapat menemukannya.

jinushaun
sumber
Meskipun itu aneh tapi itu berhasil !! Terima kasih
FindOutIslamNow
3

Untuk mengubah ke x86:

  1. Buat proyek pengaturan untuk solusi Anda.
  2. Setelah Anda membuatnya, Buka Solution Explorer, klik kanan proyek setup.
    • Tekan Configuration Manager.
    • Klik pada combobox "Platform Solusi Aktif" dan pilih Baru (Jika tidak ada x86 ditampilkan)
    • Pilih dari kombo x86 pertama lalu tekan OK.
    • membangun kembali proyek Pengaturan, lalu membangun kembali Semua proyek.
ShouShouLeb
sumber
3

Jika Anda menjalankan situs web, Anda juga dapat mencoba mengatur kumpulan aplikasi untuk menonaktifkan Aplikasi 32-bit (di bawah pengaturan lanjutan kumpulan).

scramblor
sumber
2
Saya memiliki yang sebaliknya dan harus mengaktifkan aplikasi 32-bit.
row1
2

Dalam kasus pribadi saya, masalah telah diperbaiki dengan mencari id kelas di Windows Registry pada mesin pengembang (karena masalah ini dilemparkan ke PC klien). Tindakan ini akan ditempatkan ke dalam komponen COM yang menyebabkan masalah: pustaka x86 yang dirujuk dalam proyek .NET saya yang tidak terdaftar sebagai OCX / COM untuk penginstal atau aplikasi pembaru.

Salam

César Qüeb
sumber
1

Bagi siapa pun yang menggunakan VSTO, masalah bagi saya adalah referensi yang hilang ke officeperakitan. Itu juga akan muncul jika Anda mencoba untuk instantiate objek VSTO tertentu secara manual.

Alex
sumber
1

Saya menemukan bahwa masalah saya terkait dengan pendaftaran DLL yang sebenarnya.

Pertama jalankan "Regedit.exe" dari prompt CMD (saya menaikkan tingkat keamanannya ke Administrator, "untuk berjaga-jaga") kemudian mencari Registry (dengan mengklik "Edit / Temukan" di menu RegEdit atau dengan menekan Ctrl + F) untuk CLSID yang ditampilkan dalam pesan galat yang Anda terima tentang pabrik kelas COM. CLSID saya adalah 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Ketika kunci ini ditemukan, pilih sub-kunci "InProcServer2" di bawah simpul Hive dan pastikan nama file dari masalah DLL di bingkai Regedit kanan. ditampilkan di bawah "Default". Jika file itu berada di "C: \ Windows \ SysWow64" (seperti C: \ Windows \ SysWow64 \ Redemption.dll "), maka penting bahwa Anda menggunakan file" C: \ Windows \ SysWow64 \ RegSvr32.exe "untuk daftarkan DLL dari baris perintah dan BUKAN default "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll tekan enter. Tutup jendela perintah (melalui "Keluar" kemudian Restart komputer Anda (selalu gunakan restart bukan Close Down lalu mulai naik, karena (anehnya) Restart melakukan shutdown menyeluruh dan memuat ulang semuanya sedangkan "Shut Down" dan Power-Up memuat ulang a cache yang tersimpan dari driver dan nilai-nilai lain (yang mungkin salah). Setiap kali Anda mendaftarkan DLL di masa depan, ingatlah untuk menggunakan SysWow64 "RegSvr32.exe" untuk setiap DLL yang disimpan dalam folder C: \ Windows \ SysWow64 dan masalah ini c (jika disebabkan oleh pendaftaran yang salah) seharusnya tidak terjadi lagi.

Chris Raisin
sumber
Tip yang bagus, tetapi perlu diketahui bahwa mendaftarkan DLL 32bit di SysWow64 maka diasumsikan DLL memiliki pembungkus untuk menangani permintaan 64 bit.
Fandango68
0

Masalah saya adalah bahwa saya salah versi MS Sync FrameWork (1.0) di referensi proyek saya. Setelah memperbarui ke versi 2.1, kesalahan itu hilang dan hidup kembali baik.

Phogrammer
sumber
0

Dalam kasus saya, saya membuat file ms office seperti wordatau excel, saya jalankan Win+Rdan jalankan dcomcnfg, di DCOM Config, selain pilih item nama terkait OFFICE (seperti nama berisi Excelatau Wordatau Office) dan Open the properties, select Identity tab and select the interactive user.sebagai jawaban ini ,

Pesan kesalahan saya muncul CLSID {000209FF-0000-0000-C000-000000000046}, jadi saya harus mencoba menemukan CLSID spesifik ini di DCOM Config, dan memang sudah keluar, dan saya memilihnya dan mengikuti langkah yang sama mengatur interactive user, kemudian berfungsi.

yu yang Jian
sumber