Tôi đã viết một thư viện lớp COM có thể nhìn thấy trong C# 4.0 mà tôi đang tiêu thụ với VB6. Điều này hoạt động, chỉ khi tôi mở trình duyệt đối tượng VB6 và nhìn vào các thành viên bị lộ, tôi thấy một sự kiện cho mỗi và mọi thành viên tiếp xúc duy nhất ... nhưng mã C# không xác định bất kỳ.VB6/COM Interop: các sự kiện này đến từ đâu?
Điều này có bình thường không? Tôi có làm điều gì sai?
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IMyClass))]
public class MyClass : IMyClass
{
public void DoSomething(string someParam)
{
...
}
}
public interface IMyClass
{
void DoSomething(string someParam);
}
Việc lắp ráp được ký kết với một chìa khóa tên mạnh mẽ và AssemblyInfo.cs
có tập [assembly: ComVisible(true)]
thuộc tính, nhưng tôi không chắc chắn nó có liên quan gì đến vấn đề này.
Khi tôi nhìn vào trình duyệt đối tượng trong VB6, tôi sẽ mong đợi để xem DoSomething(string)
như một thành viên của MyClass
, và tôi làm, tuy nhiên tôi cũng nhìn thấy một sự kiện với một chữ ký phù hợp cho tất cả các tiếp xúc , như Event DoSomething(someParam As String)
là thành viên của MyClass
.
Thậm chí nhiều hơn khó hiểu (với tôi ít nhất), tài sản cũng có một "phù hợp với" sự kiện (chỉ có thể nói từ biểu tượng sét chút mặc dù) - nếu MyClass
định nghĩa một tài sản như thế này:
public string SomeProperty { get; set; }
Các VB6 đối tượng trình duyệt sẽ nói rằng "sự kiện" được định nghĩa là Property SomeProperty As String
, mà lá tôi flabbergasted - làm thế nào để một "tài sản" 1) được nhân đôi và 2) trùng lặp được hiển thị với một "sự kiện" biểu tượng trong trình duyệt đối tượng? Điều tương tự cũng áp dụng cho các thuộc tính chỉ nhận được, trong đó có đối tác "thuộc tính/sự kiện" chỉ đọc của họ.
Các sự kiện này đến từ đâu và làm cách nào để loại bỏ chúng?
CẬP NHẬT Một hình ảnh đáng giá ngàn lời nói:
CẬP NHẬT Các điều sai là ComSourceInterfaces
thuộc tính được nhầm lẫn được sử dụng ở vị trí của một thuộc tính ComDefaultInterface
. Trao đổi các cựu cho sau này cung cấp cho các kết quả mong đợi:
Vì đây thực chất là lỗi đánh máy, tôi sẽ bỏ phiếu để đóng nội dung này là quá địa phương hóa. Tôi khuyên bạn nên xóa nó. – Deanna
@Deanna typo thực sự, nhưng tôi đã học được điều gì đó về việc phơi bày các sự kiện cho COM .. Tôi đoán bạn nói đúng, phải có nhiều bài viết SO về việc phơi bày các sự kiện .net cho COM ... ngoại trừ có hai bài đăng chất lượng ở đây không xứng đáng bị xóa :) –
@Deanna Tôi không nghĩ chúng ta nên xóa cái này. Đó là một lỗi đánh máy, nhưng nó có thể gây nhầm lẫn cho những người khác là người mới đến COM interop. Tôi đã học được điều gì đó từ nó. – MarkJ