Trình biên dịch cho phép bạn nhanh chóng giao diện nếu họ đang được trang trí với một thuộc tính CoClass
xác định các lớp bê tông mà thực hiện chúng (cũng như một ComImport
và Guid
). Khi bạn khởi tạo giao diện, bạn thực sự sẽ khởi tạo lớp bê tông này đằng sau hậu trường.
Tính năng này được thiết kế để sử dụng làm đường ống dẫn nước cho các loại được nhập COM. Chú ý cách giao diện Outlook Application
được hỗ trợ bởi một lớp bê tông được đặt tên ApplicationClass
:
[GuidAttribute("00063001-0000-0000-C000-000000000046")]
[CoClassAttribute(typeof(ApplicationClass))]
public interface Application : _Application, ApplicationEvents_11_Event
Trong hầu hết các trường hợp, bạn nên không đi áp dụng các thuộc tính để giao diện của riêng bạn. Tuy nhiên, để minh chứng, chúng tôi có thể chỉ ra rằng trình biên dịch sẽ cho phép bạn tận dụng khả năng này để khởi tạo các giao diện trong mã của bạn. Hãy xem xét các ví dụ đơn giản sau đây (GUID là ngẫu nhiên):
[ComImport]
[Guid("175EB158-B655-11E1-B477-02566188709B")]
[CoClass(typeof(Foo))]
interface IFoo
{
string Bar();
}
class Foo : IFoo
{
public string Bar()
{
return "Hello world";
}
}
Sử dụng tờ khai nêu trên, bạn có thể tạo một thể hiện của giao diện IFoo
riêng bạn:
IFoo a = new IFoo();
Console.WriteLine(a.Bar());
// Output: "Hello world"
Sửa: Mặc dù jonnyGold ghi nhận một cách chính xác rằng phiên bản Excel Application
không được trang trí với CoClass
trên MSDN, điều này có vẻ là thiếu sót MSDN. Chữ ký dịch ngược từ lắp ráp Microsoft.Office.Interop.Excel
là:
[CoClass(typeof(ApplicationClass)), Guid("000208D5-0000-0000-C000-000000000046")]
[ComImport]
public interface Application : _Application, AppEvents_Event
Cảm ơn bạn đã giải thích rõ ràng. Tôi bây giờ còn lại tự hỏi "tại sao?", Nhưng tôi giả định một sự hiểu biết tốt về COM interop sẽ là điều kiện tiên quyết cho điều đó. –
Đoán không được chứng minh của tôi là đây là một "hack" được giới thiệu trong trình biên dịch .NET hoàn toàn để giải quyết một số yêu cầu cũ trong khi tương tác với COM. – Douglas
Theo [this] (http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.application.aspx) 'Microsoft.Office.Interop.Excel.Application' không được trang trí với 'CoClassAttribute', nhưng nó phải là. Phải thừa nhận rằng, tôi đã không sử dụng dotPeek trên assmebly trong câu hỏi. – bluevector