Подтвердить что ты не робот

Пожалуйста, объясните, почему я могу создать экземпляр интерфейса "Приложение" в Excel VSTO

В моем приложении есть следующий код С#, который отлично работает. Он запускает новый экземпляр Excel.

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

Я только недавно заметил, что Application - это тип интерфейса. Что именно происходит и как это возможно?

4b9b3361

Ответ 1

Компилятор позволяет вам создавать интерфейсы, если они декорированы атрибутом CoClass, определяющим конкретный класс, который их реализует (а также a ComImport и Guid), Когда вы создаете экземпляр интерфейса, вы фактически создаете этот конкретный класс за кадром.

Эта "функция" предназначена для использования в качестве сантехники для импортированных типов COM. Обратите внимание, что интерфейс Outlook Application поддерживается конкретным классом с именем ApplicationClass:

[GuidAttribute("00063001-0000-0000-C000-000000000046")]
[CoClassAttribute(typeof(ApplicationClass))]
public interface Application : _Application, ApplicationEvents_11_Event

В большинстве случаев вы не должны применять эти атрибуты к своим собственным интерфейсам. Однако для демонстрации мы можем показать, что компилятор позволит вам воспользоваться этой возможностью для создания интерфейсов в вашем коде. Рассмотрим следующий простой пример (GUID является случайным):

[ComImport]
[Guid("175EB158-B655-11E1-B477-02566188709B")]
[CoClass(typeof(Foo))]
interface IFoo
{
    string Bar();
}

class Foo : IFoo
{
    public string Bar()
    {
        return "Hello world"; 
    }
}

Используя приведенные выше объявления, вы можете создать экземпляр вашего собственного интерфейса IFoo:

IFoo a = new IFoo();
Console.WriteLine(a.Bar());
// Output: "Hello world"

Изменить. Хотя jonnyGold правильно отмечает, что Excel Application экземпляр не украшен CoClass в MSDN, это, по-видимому, является пропуском MSDN. Декомпилированная подпись из сборки Microsoft.Office.Interop.Excel:

[CoClass(typeof(ApplicationClass)), Guid("000208D5-0000-0000-C000-000000000046")]
[ComImport]
public interface Application : _Application, AppEvents_Event

Ответ 2

Потому что MSDN говорит так:

Например, следующий код использует интерфейс Excel Microsoft.Office.Interop.Excel.Application. Во время выполнения он использует класс Application для создания экземпляра объекта приложения Excel и открытия рабочего листа.