2012-06-14 29 views
16

Tôi có mã C# sau trong ứng dụng của tôi hoạt động tốt. Nó khởi chạy một phiên bản Excel mới.Hãy giải thích lý do tại sao tôi có thể khởi tạo giao diện "Ứng dụng" trong Excel VSTO

private readonly Microsoft.Office.Interop.Excel.Application _application; 
_application = new Microsoft.Office.Interop.Excel.Application(); 
_application.Visible = true; 

Tôi chỉ mới nhận thấy rằng Application là loại giao diện. Chính xác những gì đang xảy ra và làm thế nào là nó có thể?

Trả lời

26

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 ComImportGuid). 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 
+0

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 đó. –

+0

Đ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

+0

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

-2

MSDN nói như vậy:

Ví dụ, đoạn mã sau sử dụng giao diện Excel Microsoft.Office.Interop.Excel.Application. Khi chạy, nó sử dụng lớp Ứng dụng để khởi tạo đối tượng Ứng dụng Excel và mở một trang tính.

+2

Hầu như không một câu trả lời thỏa đáng ... MSDN cũng nói – Douglas

+0

Đồng ý “Một giao diện không thể được khởi tạo trực tiếp.”. Bài viết không giải thích làm thế nào mà thậm chí là cú pháp hợp lệ. Cũng không phải là tài liệu thư viện. – bluevector

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