2011-02-09 7 views
9

У меня нет очень много предпосылок относительно COM или coclasses, поэтому я не совсем понимаю, почему я могу использовать оператор new с интерфейсом. От языка/рамочный агностик взгляд, это заблуждение, почему это компилируется и работает правильно:Почему возможно создать новый экземпляр COM-интерфейса?

using Microsoft.Office.Interop.Excel; 

public class ExcelProgram 
{ 
    static void Main(string[] args) 
    { 
     Application excel = new Application(); 
    } 
} 

Проверка Application в Visual Studio 2010 показывает мне:

using System.Runtime.InteropServices; 

namespace Microsoft.Office.Interop.Excel 
{ 
    // Summary: 
    //  Represents the entire Microsoft Excel application. 
    [Guid("000208D5-0000-0000-C000-000000000046")] 
    [CoClass(typeof(ApplicationClass))] 
    public interface Application : _Application, AppEvents_Event 
    { 
    } 
} 

Что происходит за кулисами?

ответ

5

Это возможно только для интерфейсов COM. У Марка Гравелла есть объяснение here.

Короткий ответ заключается в том, что COM-интерфейс может быть сопряжен с классом реализации «по умолчанию», поэтому, когда вы «создаете экземпляр» интерфейса, вы фактически создаете экземпляр этого класса реализации по умолчанию. В случае интерфейса Application в вашем примере это выглядит как ApplicationClass.

+0

Спасибо. У этой ссылки была ссылка на ссылку http://stackoverflow.com/questions/1093536/how-does-the-c-compiler-detect-com-types. Думаю, я искал неправильные ключевые слова - похоже, мой вопрос по сути является дубликатом. – ide