Tôi đã không làm việc với COM interop trong một thời gian, nhưng trước đây tôi luôn làm việc với triết lý "chọn tham gia" thay vì "chọn không tham gia" thay vì làm cho mọi thứ COM hiển thị, tôi đánh dấu lắp ráp như không COM hiển thị. Sau đó tôi tập trung vào việc hiển thị các thành viên loại (có nghĩa là bằng cách chọn tham gia), và đảm bảo rằng API được tiếp xúc là lành mạnh cho COM (ví dụ COM không hỗ trợ Genrics, quá tải phương thức hoặc các hàm tạo tham số) và nó cũng có đã được thử nghiệm với COM trong tâm trí. Bằng cách này, việc đưa ra một API đến COM được thực hiện theo cách nghiêm ngặt, được kiểm tra, giới hạn và duy trì.
Điều này trái ngược với việc làm cho mọi thứ có thể nhìn thấy và sau đó lo lắng về bất kỳ vấn đề tiềm ẩn nào sau này, lưu ý rằng nếu bạn đã tiếp xúc mọi thứ thì có thể có khớp nối với người dùng giao diện COM mà bạn không mong đợi và bây giờ gặp khó khăn trong việc sao lưu.
Từ ký ức một vài ví dụ về hậu quả bất ngờ:
Khi xuất phương pháp quá tải, họ được xuất khẩu và được đặt tên theo mặc định với một số thứ tự ví dụ OverloadedMethod1, OverloadedMethod2, vv Nếu bạn refactor mã của bạn và thay đổi thứ tự của các phương pháp của bạn hoặc chèn một quá tải, vv, bạn đang gặp rắc rối với bất cứ ai đã sử dụng các phương pháp này từ giao diện COM trước đó của bạn. OverloadedMethod1 và OverloadedMethod2 có thể đã được đổi chỗ.
Các lớp được tiếp xúc với COM phải có hàm tạo không tham số. Nếu không có một bài kiểm tra đơn vị tại chỗ duy trì hợp đồng này, sau đó nó rất dễ dàng để thay đổi lớp đó vào một ngày sau đó để nó không có một constructor parameterless và do đó phá vỡ người sử dụng giao diện COM của bạn.
Điều quan trọng là xuất giao diện COM không có miễn phí vì có sự không tương thích và yêu cầu phải được đáp ứng. Điều này phải được cả hai suy nghĩ về và sau đó duy trì. Cảnh báo CA1017 là ám chỉ đến điều này.
Nguồn
2010-07-22 14:27:54
Câu hỏi không phải là cách khắc phục. Câu hỏi đặt ra là cảnh báo này đang cố gắng cảnh báo về điều gì trước tiên. – sharptooth
AS MSDN cũng xác định nguyên nhân gốc rễ của cảnh báo này, tức là "Kiểu hiển thị mô hình đối tượng thành phần (COM) có nguồn gốc từ loại không hiển thị COM". –
Đó không phải là một vấn đề khó tìm thấy ngay cả khi không có cảnh báo. Một phần rất thô lỗ và tinh tế là bạn sẽ có tất cả các công cụ được đăng ký trong COM với một hội đồng ComVisible. – sharptooth