2012-03-14 37 views
8

Trong dự án VC++, tôi đang cố tạo một cá thể (thông qua COM) của lớp C# chứa trong dự án C#.Lỗi không được đăng ký lớp để khởi tạo đối tượng C# qua COM từ VC++

kiện

  • Cả C# và C++ Dự án được biên dịch sử dụng .NET 4.0
  • C# .dll đang được đăng ký sử dụng regasm/codebase "CSharpProjectName.dll"", và cửa sổ command prompt Trong các dự án C++, tôi cố gắng tạo một thể hiện của một lớp trong dự án C#, nhưng tôi nhận được một HRESULT của 0x80040154 - lớp không được đăng ký

Đây là một ví dụ về nỗ lực của tôi để tạo một thể hiện của đối tượng .NET từ C# .dll. Lớp bê tông Tôi cố gắng để nhanh chóng được gọi là nhân viên, mà vì lợi ích của trình bày câu hỏi của tôi chỉ đơn giản, thực hiện các giao diện IPerson:

CSharpProjectName::IPersonPtr pPersonPtr; 
    HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee); 

Tại sao tôi nhận được một lỗi "class không đăng ký" mặc dù tôi đã đăng ký C# .dll sử dụng "regasm/codebase" và xác nhận sự tồn tại của khóa trong registry?

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn!

+0

Tôi có vấn đề chính xác này! – TinyRacoon

Trả lời

9

Tôi đã gặp sự cố đó trong quá khứ và đó là do cả hai quá trình không phải là 32 hoặc 64 bit. Nếu bạn đang chạy một hệ điều hành 32 bit, bạn có thể ngừng đọc ngay bây giờ bởi vì những gì tôi nói không áp dụng.

Sử dụng regedit để thử và tìm ProgIds và CLSID của bạn trong sổ đăng ký. Nếu dự án C++ của bạn là 32-bit, hãy chắc chắn rằng các lớp C# của bạn đã được đăng ký với tổ hợp 32-bit - HKEY_CLASSES_ROOT \ Wow6432Node. Nếu dự án C++ của bạn là 64 bit, hãy đảm bảo rằng các lớp C# của bạn đã được đăng ký với tổ hợp 64-bit - HKEY_CLASSES_ROOT.

Nếu bạn cần đăng ký để hive 64-bit, bạn có thể cần phải gọi phiên bản của regasm.exe dưới c: \ windows \ microsoft.net \ framework64 ...

Khả năng khác cho những thứ để đi sai là bạn có thể cần phải chạy phiên bản .NET 4.0 của regasm.exe. Nếu bạn chỉ cần gõ "regasm" trong dòng lệnh, nó sẽ cho bạn phiên bản regasm bạn đang chạy. Bạn có thể cần phải gõ đường dẫn đầy đủ của phiên bản .NET 4.0 của regasm - được tìm thấy tại c: \ windows \ microsoft.net \ framework \ v4.0.3019 \ regasm.exe.

+1

đó là nó! Tôi đã sử dụng v2.0 ... regasm hơn là v4.0 .... regasm. Cảm ơn rất nhiều! – BigSauce

+0

vì vậy, nếu CLID yêu cầu là 91493441-5A91-11CF-8700-00AA0060263B và sau khi thử tìm kiếm không thể tìm thấy nó giữa các sổ đăng ký hiện tại (regedit)? –

1

Bạn đã thử tùy chọn /tlb? Hãy thử điều đó và sau đó

#import "your_tlb_file_lol.tlb" no_namespace 

Tôi nghĩ rằng tùy chọn khác có thể là gấc lắp ráp và sau đó sửa lại.

+0

Tôi đã thử sử dụng ** # import "CSharpProjectName.tlb" named_guids raw_interfaces_only **. Vẫn không hoạt động ... – BigSauce

0

Cố gắng rời khỏi dự án của bạn trong 32 bit bởi vì bạn biết dự án của bạn, tạo ra trong bất kỳ CPU một thành phần tích cực chạy ở 32 với một lỗi registry, do đó thay đổi việc xây dựng đến 32 hoặc tốt hơn là để 32.

Bạn Quá đăng ký dll của bạn với regsvr32

Các vấn đề liên quan