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ó?
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ó?
Câu trả lời:
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ế.
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.
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.
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.
DesktopWallpaperbằng CLSCTX_INPROC(thay vì CLSCTX_ALL), bạn sẽ gặp 0x80040154 (REGDB_E_CLASSNOTREG)lỗi.
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.
Bằng cách đăng ký lớp (cụ thể là CLSID của nó) - xem ví dụ ở đây .
trong trường hợp của tôi
my platform là x64
the Dll library(sdk)và redistributable packagelà x64
vì thế
trong trình khám phá giải pháp navigate to your project
mở Properties
change the Platform target from AnyCPU to x64
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ế.
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.
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.
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)
đ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 .
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ủ
Ở đâ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
