2009-11-06 39 views
6

Tôi có một assembly .NET mà tôi đang trưng bày cho COM. Hội đồng có hai giao diện công cộng và một lớp công cộng. Khi tôi xây dựng hội đồng, tôi nhận được cảnh báo này:COM đăng ký Interop

(assemblyName.dll) không chứa bất kỳ loại nào có thể được đăng ký cho COM Interop.

Thông tin lắp ráp của tôi bao gồm dòng sau.

[assembly: ComVisible(true)] 

Hầu hết mọi người gặp sự cố này trên web, mà tôi đã tìm thấy, đã khắc phục sự cố đó bằng dòng trên trong thông tin lắp ráp của họ. Điều này đã không giúp ích cho tôi.

Tôi cũng đã thử thêm [ComVisible(true)] vào định nghĩa lớp và giao diện và cũng không giúp ích gì.

Trả lời

15

ComVisible nói chung cần phải có một constructor mặc định nào. Các thành viên của nó cũng thường chỉ tham khảo các loại ComVisible.

Bạn không cần chỉ định ComVisible (true) trên lớp nếu bạn đã chỉ định nó ở cấp assembly.

Tuy nhiên, theo cách thông thường để tạo ra một hội đồng với các lớp ComVisible là:

  • Chỉ định ComVisible (false) tại Đại hội cấp. Do đó chỉ có các lớp được đánh dấu rõ ràng với ComVisible (true) được tiếp xúc với COM.

  • Xác định một giao diện ComVisible rõ ràng:

ví dụ

[ 
ComVisible(true), 
GuidAttribute("..."), 
Description("...") 
] 
public interface IMyComVisibleType 
{ 
     // members... 
    } 
  • lớp ComVisible bạn nên xác định ClassInterfaceType.None, và nên thực hiện các giao diện ComVisible:

ví dụ

 [ 
    ComVisible(true), 
    GuidAttribute("..."), 
    ClassInterface(ClassInterfaceType.None) 
    ] 
    public sealed class MyComVisibleType : IMyComVisibleType 
    { 
     // implementation ... 
    } 

Lưu ý rằng các thuộc tính Hướng dẫn và mô tả không bắt buộc, nhưng hữu ích để giúp bạn kiểm soát nhiều hơn việc tạo COM.

Nếu những điều trên không có tác dụng, hãy thử đăng một số mã mẫu và tôi chắc chắn ai đó sẽ có thể trợ giúp.

+1

Việc quên thêm một hàm tạo mặc định xảy ra với tôi đôi khi để +1 đề cập đến nó. –

+1

Việc thêm một hàm tạo mặc định công khai thực hiện thủ thuật, lớp được đề cập chỉ được xây dựng từ mã .net. Đây là lý do không có hàm tạo mặc định công khai nào được cung cấp. Tôi cho rằng cảnh báo này cũng sẽ xuất hiện cho một assembly chỉ chứa các giao diện. – trampster

+0

Có, bạn sẽ nhận được cảnh báo tương tự cho một hội đồng chỉ với các giao diện. Tôi đoán nó tương tự như cách một VB6 ActiveX DLL phải chứa ít nhất một lớp học có thể tạo công khai. Nhưng có vẻ như hạn chế không cần thiết trong thế giới .NET, vì bạn có thể có một lớp được xây dựng bởi mã được quản lý và được chuyển đến một thành phần COM, ví dụ: làm đối số phương thức. – Joe

0

Dưới đây là một vài điều khác là true

  • Hãy chắc chắn rằng các loại bạn muốn đăng ký được đánh dấu là công
  • Thêm thuộc tính ComVisible(true) để loại trực tiếp ngoài việc lắp ráp
  • Add thuộc tính Guid

Không chắc chắn 2 điều cuối cùng có cần thiết hay không nhưng tôi sẽ thử chúng.

+0

GUID được tạo tại thời gian xây dựng dựa trên tên của lớp học đủ điều kiện và danh tính của hội đồng có chứa lớp. tức là không cần thiết để tự làm điều này. – trampster

+0

Đã thử ComVisable (true) trên các loại + double kiểm tra xem các loại có công khai không. Vẫn không có may mắn. – trampster

+0

Điều gì về việc thêm thuộc tính GUID vào mỗi lớp được hiển thị? – Beached

0

Tôi nghĩ bạn cần có một hội đồng được đặt tên mạnh. Bạn có đăng ký hội đồng của bạn với một tập tin quan trọng?

Hơn nữa, cũng cố gắng xác định: [Guid ("{mới được tạo GUID}")] [ClassInterface (ClassInterfaceType.AutoDual)]

lớp
+0

không, tôi không nhưng nó không cần phải mạnh mẽ tên tôi có hội đồng khác .net mà làm việc cho com interop và không stong tên. – trampster

+0

Quên đề cập rằng nó cũng phải có một hàm tạo tham số công khai ít tham số mặc định. – logicnp

2

Tôi đã gặp sự cố về hàm tạo mặc định. Điều gì đánh lừa tôi là tập tin thư viện kiểu sẽ chứa tham chiếu GUID lớp mặc dù lớp đó không được đăng ký. Một cách nhanh chóng để xem những gì sẽ được đăng ký là để tạo ra một tập tin registry ('assembly.reg') như thế này:

regasm assembly.dll /regfile:assembly.reg /codebase 

Có một cuộc thảo luận tốt về lộ giao diện trong COM Interop: Base class properties not exposed to COM. Một số mã ví dụ là ở đây: Exposing .NET Components to COM.

0

Tôi đã có cùng một vấn đề về một dự án mà tôi đã kiểm tra tùy chọn "Đăng ký cho COM interop" cho dự án C# của tôi. Có một giải pháp dễ dàng:

Khi đang ở trong Solution Explorer, hãy chuyển đến thư mục Thuộc tính. Mở tệp AssemblyInfo.cs. Cuộn xuống dòng mà nói: [assembly: ComVisible(false)]

Thay đổi này để: [assembly: ComVisible(true)]

này sẽ loại bỏ các thông điệp cảnh báo, và cho phép các tập tin .tlb được tạo ra, sau đó cho phép mã NET cho tầm nhìn COM .
Nếu bạn không muốn toàn bộ assembly được hiển thị COM thì hãy làm theo một trong các mẹo khác ở trên.

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