Hy vọng rằng câu hỏi là rõ ràng nhưng để pad nó ra cho rõ ràng:Làm thế nào để lộ một enum định nghĩa trong một thư viện COM qua interop như kiểu trả về của aC# chức năng
Tôi có một dll VB6 định nghĩa một enum mà Tôi đang tham khảo trong dll C# của tôi. C# dll định nghĩa một CCW theo cách chính xác với một giao diện idispatch khai báo một hàm trả về kiểu là enum.
Khi chạy regasm tôi nhận được cảnh báo rằng enum không hiển thị COM và do đó chức năng không được xuất. Kể từ khi nó được định nghĩa trong thư viện VB6 của tôi tôi đã có thể nghĩ rằng nó đã được COM có thể nhìn thấy kể từ khi nó được định nghĩa trong một dll COM.
Tôi nhận ra mình có thể ngừng làm phiền và sử dụng int để vượt qua enum và chỉ thực hiện kết thúc, nhưng nó thật sự bực mình và tôi muốn biết liệu có tồn tại hay không.
Theo yêu cầu ở đây là một số mẫu mã:
VB6 dll định nghĩa một enum
Public Enum myEnum
first = 0
second = 1
End Enum
này được nhập khẩu qua interop vào C# và nếu bạn xem các siêu dữ liệu nó trông giống như
này[Guid("EnumGUID")]
public enum myEnum
{
first = 0,
second = 1
}
Sau đó, giao diện CCW được xác định
[ComVisible(true)]
[Guid("InterfaceGuid")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyCCWInterface
{
[DispId(1)]
myEnum myFunction();
}
Regasm phàn nàn rằng myEnum không hiển thị. Tôi phải đồng ý với nó vì chế độ xem siêu dữ liệu không có thuộc tính hiển thị com. Kỳ lạ nếu tôi sử dụng các loại khác định nghĩa trong VB dll cho các đối số của chức năng tôi nhận được không có khiếu nại, nó chỉ xuất hiện để được enum và tôi đoán đó là bởi vì tôi thực sự phơi bày việc thực hiện interopped của VB6 enum và không phải là thực tế enum. Vì vậy, tôi nghĩ rằng tôi hiểu vấn đề, những gì tôi muốn biết là nếu có một cách để có được điều này làm việc bằng cách sử dụng enums mà không liên quan đến hack bất kỳ mã trung gian hoặc tự động tạo ra.
VB6 có phải là dll COM không? Vui lòng cho chúng tôi biết một số mã để hiểu vấn đề. –