Cách giải quyết Lớp ngoại lệ COM không được đăng ký (Ngoại lệ từ HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?


90

Khi tôi cố gắng tạo một phiên bản của lớp COM, nó sẽ ném ra một ngoại lệ là

Lớp chưa được đăng ký (Ngoại lệ từ HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Xin vui lòng đề nghị làm thế nào tôi có thể giải quyết nó?


1
Bạn có thể cung cấp thêm chi tiết với một số mã?
— Xaisoft 30/09/09

10
Có hai câu hỏi: 1. Bạn có cài đặt / đăng ký thành phần COM trên máy Windows 7 x64 không? 2. Nền tảng mục tiêu của ứng dụng của bạn là gì, tôi nghĩ bạn nên đặt nền tảng thành x86, vui lòng không đặt nó là "Bất kỳ CPU nào"? Vui lòng đăng ký COM đầu tiên và sau đó chạy để kiểm tra các ứng dụng, xin vui lòng tham khảo các tài liệu: support.microsoft.com/kb/146219 và Giải thích về Regsvr32 sử dụng và thông báo lỗi
— JackWang

Tôi đã giải quyết nó mà không thay đổi mục tiêu xây dựng thành 'x86'. Giải pháp trong liên kết: < stackoverflow.com/a/55513690/11310933 >
— Sunil Xtha

Câu trả lời:


47

Có vẻ như bất kỳ chương trình hoặc quy trình nào bạn đang cố khởi chạy đều không được cài đặt trên máy của bạn, có cài đặt bị hỏng hoặc cần được đăng ký.

Cài đặt nó, sửa chữa nó (thông qua Thêm / Loại bỏ Chương trình) hoặc đăng ký nó (thông qua Regsvr32.exe).

Bạn chưa cung cấp đủ thông tin để chúng tôi có thể giúp bạn nhiều hơn thế.


4
Hãy nghĩ rằng bạn có nghĩa là RegSvr32.exe (đối lập với RegSrv32.exe).
— windowsgm,

60

Bạn cần đảm bảo rằng tất cả các tổ hợp của bạn đang biên dịch cho đúng kiến ​​trúc. Hãy thử thay đổi kiến ​​trúc cho x86 nếu việc cài đặt lại thành phần COM không hoạt động.


Điều này đã giải quyết được quá trình của tôi không tìm thấy NAV 2009 R2 Client (ClassID 50000004-0000-1000-0001-0000836BD2D2).
— Vincent Vancalbergh

14

Vấn đề của tôi và giải pháp

Tôi có một dll 32 bit của bên thứ ba mà tôi đã cài đặt trong máy R2 2008 là 64 bit.

Tôi có một dịch vụ wcf được tạo trong khuôn khổ .net 4.5 gọi dll bên thứ ba 32 bit để xử lý. Bây giờ tôi đã đặt thuộc tính xây dựng để nhắm mục tiêu cpu 'bất kỳ' và triển khai nó cho máy 64 bit.

khi tôi cố gọi dịch vụ wcf gặp lỗi "80040154 Lớp chưa được đăng ký (Ngoại lệ từ HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"

Bây giờ tôi đã sử dụng ProcMon.exe để theo dõi vấn đề đăng ký com và xác định rằng quá trình đang tìm kiếm mục đăng ký tại HKLM \ CLSID và HKCR \ CLSID nơi không có mục nhập.

Nên biết rằng Microsoft sẽ không đăng ký các thành phần 32 bit com vào các đường dẫn HKLM \ CLSID, HKCR \ CLSID trong máy 64 bit thay vì đặt mục nhập vào các đường dẫn HKLM \ Wow6432Node \ CLSID và HKCR \ Wow6432Node \ CLSID.

Bây giờ xung đột là quy trình 64 bit đang cố gắng gọi quy trình 32 bit trong máy 64 bit sẽ tìm kiếm mục đăng ký trong HKLM \ CLSID, HKCR \ CLSID. Giải pháp là chúng ta phải buộc quá trình 64 bit xem xét mục đăng ký tại HKLM \ Wow6432Node \ CLSID và HKCR \ Wow6432Node \ CLSID.

Điều này có thể đạt được bằng cách định cấu hình các thuộc tính của dự án dịch vụ wcf để nhắm mục tiêu đến máy 'X86' thay vì 'Bất kỳ'.

Sau khi triển khai phiên bản 'X86' cho máy chủ 2008 R2, gặp sự cố "System.BadImageFormatException: Không thể tải tệp hoặc lắp ráp"

Giải pháp cho badimageformatexception này là thiết lập 'Enable32bitApplication' thành 'True' trong thuộc tính IIS Apppool cho đúng apppool.


Vui lòng không đăng các câu trả lời giống hệt nhau cho nhiều câu hỏi. Đăng một câu trả lời hay, sau đó bình chọn / gắn cờ để đóng các câu hỏi khác là trùng lặp. Nếu câu hỏi không trùng lặp, hãy điều chỉnh câu trả lời của bạn cho phù hợp với câu hỏi .
— kleopatra

10

Cũng lưu ý rằng ngữ cảnh lớp khi khởi tạo có thể tạo ra ngoại lệ đó. Nếu bạn có một đối tượng được mã hóa là INPROC_SERVER nhưng bạn cố gắng CoCreateInstance là CLSCTX_LOCAL_SERVER, bạn cũng sẽ gặp lỗi đó.

Bạn cần đảm bảo đối tượng đã được đăng ký và CoCreateInstance đang tạo một thể hiện với ngữ cảnh lớp chính xác.


Đúng, nếu chẳng hạn bạn cố gắng tạo DesktopWallpaperbằng CLSCTX_INPROC(thay vì CLSCTX_ALL), bạn sẽ gặp 0x80040154 (REGDB_E_CLASSNOTREG)lỗi.
— user362515

9

Nếu bạn đang sử dụng các thành phần COM 64 bit trong ứng dụng web trên IIS, hãy đảm bảo nhóm ứng dụng được đặt thành không cho phép các ứng dụng 32 bit ( Bật ứng dụng 32 bit: false trong cài đặt nâng cao)


4

Tôi đã làm cho nó hoạt động bằng cách Bật ứng dụng 32 bit trong cài đặt nâng cao Nhóm ứng dụng. Nhấp chuột phải vào nhóm ứng dụng và chọn cài đặt nâng cao - bật các ứng dụng 32 bit. Điều này có thể giúp ai đó ngoài kia.


Tương tự cho tôi. Dll 32 bit được sử dụng trên máy phát triển 64 bit, kiểm tra 64 bit và máy chủ trực tiếp 64 bit. Hoạt động tốt trên hộp phát triển. Khi được triển khai đến các máy chủ thử nghiệm và trực tiếp, nó không thành công cho đến khi các ứng dụng 32 bit được cho phép trong IIS App Pools tương ứng và các nhóm được khởi động lại. Tôi cũng phải tắt "Nhúng kiểu tương tác" (cài đặt trên dll vi phạm trong VS) và đặt "Sao chép cục bộ" = true để đảm bảo dll thực sự được sao chép ở dạng ban đầu vào máy chủ.
— cymorg

3

Bằng cách đăng ký lớp (cụ thể là CLSID của nó) - xem ví dụ ở đây .


Nó cũng có thể là một số đối tượng cần được cài đặt trên máy tính hoặc máy chủ của anh ta, không nhất thiết phải đăng ký lớp.
— Xaisoft 30/09/09

@Xaisoft, "cài đặt" thường liên quan đến "đăng ký", như url MSDN mà tôi đã đề cập.
— Alex Martelli, 30/09/09

3

trong trường hợp của tôi

my platform là x64

the Dll library(sdk)và redistributable packagelà x64

vì thế

  1. trong trình khám phá giải pháp navigate to your project

  2. mở Properties

  3. change the Platform target from AnyCPU to x64

nhập mô tả hình ảnh ở đây


2

Cách mà tôi giải quyết vấn đề này là đăng ký COMqua regsvr32.

đảm bảo rằng COM bạn đang gọi đã được đăng ký.

Ứng dụng của tôi đã được sử dụng xceedcry.dllvà tôi đã không đăng ký nó. Sau khi tôi đăng ký, ứng dụng hoạt động tốt.


2

Giải pháp của tôi là thay đổi " Bật ứng dụng 32-bit " thành True trong cài đặt nâng cao của nhóm ứng dụng tương đối trong IIS.

Nhóm ứng dụng

Bật các ứng dụng 32 bit


2

Trong trường hợp của tôi, lớp đã được đăng ký đúng cách và được xây dựng ở BẤT KỲ chế độ CPU / 64 bit nào .

Nhưng thuộc tính Bật ứng dụng 32-bit của nhóm Ứng dụng IIS của ứng dụng sử dụng lớp được đặt thành Đúng .

Không tìm thấy lớp do không khớp về kiến ​​trúc giữa cấu hình nhóm ứng dụng và lớp đã đăng ký thực tế.

Cài đặt Bật ứng dụng 32-bit thành Sai đã khắc phục sự cố. Cài đặt Nhóm ứng dụng IIS


1

Đối với tôi, tôi đã phải tạo cấu hình xây dựng 64 bit.


1

Tôi đã gặp vấn đề tương tự khi sử dụng MapWinGis. Tôi đã tìm thấy giải pháp, làm việc trên Visual studio 2015 windows form proyect, chỉ cần nhấp chuột phải vào proyect-> properties-> Build, đặt cấu hình thành Tất cả cấu hình và trong conbobox "mục tiêu nền tảng" đặt nó thành x64.


0

Tôi đã gặp sự cố này khi gọi lắp ráp .Net từ máy khách C ++ qua COM. Nó chỉ ra rằng không thể tìm thấy một trong các hội đồng mà tổ hợp .Net phụ thuộc vào không thể tìm thấy. Tôi đã vật lộn một lúc để cố gắng tìm ra điều gì sai với assembly 1, nhưng nó thực sự là một trong những phụ thuộc của assembly 1. Tôi đã nhận được hai lỗi khác nhau khi gọi CoCreateInstance () từ máy khách C ++. Lần đầu tiên là: REGDB_E_CLASSNOTREG Lớp chưa được đăng ký Và lần thử thứ hai là: 0x80131040: Định nghĩa tệp kê khai của hội đồng định vị không khớp với tham chiếu hợp ngữ.

Vì vậy, hãy kiểm tra xem các tham chiếu của assembly của bạn có hiện diện không. Tôi đã phát hiện ra điều này bằng cách duyệt qua assembly đầu tiên với dotPeek và nhận thấy một trong các tham chiếu của nó bị thiếu. Đặt đúng phiên bản phụ thuộc vào thư mục đã giải quyết được cả hai lỗi.


0

Tôi đang biên dịch ứng dụng của mình nhắm mục tiêu đến bất kỳ CPU nào và sự cố chính hóa ra là trình đọc adobe đã được cài đặt v10.x cũ hơn cần phải nâng cấp v11.x , đây là cách tôi giải quyết vấn đề này.


0

Tôi đã gặp phải vấn đề tương tự khi sử dụng một lớp COM, tức là 'Lớp không được đăng ký ngoại lệ' trong thời gian chạy. Đối với tôi, tôi có thể giải quyết bằng cách đi tới tệp app.config và thay đổi các phần tử 'khởi động' và 'Thời gian chạy được hỗ trợ' thành một cái gì đó như:

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

Bạn có thể đọc thêm về thông tin chi tiết tại đây http://stackoverflow.com/questions/1604663/

và đây https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

Tôi nên lưu ý rằng tôi đang chạy Visual Studio 2017. Target cpu = x86 Embed Interop Type = true (trong cửa sổ thuộc tính)


0

đi tới thư mục của .Net framework và đăng ký dll tương ứng của chúng với đường dẫn dll khoảng trắng Regsvr32.exe .


0

Tôi đã phải đối mặt với cùng một vấn đề. Sau khi thực hiện một số nghiên cứu, tôi đã tìm thấy bản sửa lỗi cho mình và nó có thể hữu ích. Theo quan sát của tôi, vấn đề không chỉ liên quan đến việc cài đặt lại, nó còn phụ thuộc vào quyền truy cập.

Bước 1: Sửa chữa đối tượng COM cụ thể.

Bước 2: Dịch vụ thành phần> Máy tính> Máy tính của tôi> Cấu hình DCOM> Chọn đối tượng COM của bạn> Nhấp chuột phải> Thuộc tính> tab Bảo mật> Quyền truy cập> Chọn Tùy chỉnh> Nhấp vào CHỈNH SỬA> Chọn IIS_USER (Nếu không tạo với toàn quyền) và hoàn thành truy cập và nhấp vào OK.

Di chuyển đến tab Danh tính> Bạn có thể chọn "Người dùng tương tác" hoặc "Người dùng này"> Nhấp vào Áp dụng và OK. Nếu bạn chọn "Người dùng này", chúng tôi phải cấp cho người dùng đặc quyền Quản trị viên cho máy chủ đó

Bước 3: Mở IIS Manager> Khởi động lại Application Pools.

Lưu ý: Nếu được yêu cầu, vui lòng khởi động lại máy chủ


-1

Ở đây tìm giải pháp, chạy công cụ mmc -32 (không phải dcomcfg)

Trên hệ thống 64 bit với Office 32 bit, hãy thử cách này:

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

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.