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

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

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

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

Ответы на вопрос(2)

MSDN говорит так:

For example, the following code uses the Excel Microsoft.Office.Interop.Excel.Application interface. At run time, it uses the Application class to instantiate an Excel Application object and open a worksheet.

 14 июн. 2012 г., 21:09
Вряд ли удовлетворительный ответ & # x2026; MSDN также говорит, что & # x201C; Интерфейс не может быть создан непосредственно. & # X201D;
 14 июн. 2012 г., 21:16
Согласовано. Статья не объясняет, насколько это даже синтаксически допустимо. Также не библиотека документации.
Решение Вопроса

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

Эта & # x201C; функция & # x201D; предназначен для использования в качестве сантехники для импортируемых типов COM. Обратите внимание, как OutlookApplication интерфейс поддерживается конкретным классом с именемApplicationClass:

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

В большинстве случаев вам следуетnot примените эти атрибуты к своим собственным интерфейсам. Однако ради демонстрации мы можем показать, что компиляторwill позволит вам воспользоваться этой возможностью для создания экземпляров интерфейсов в вашем коде. Рассмотрим следующий простой пример (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"

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

[CoClass(typeof(ApplicationClass)), Guid("000208D5-0000-0000-C000-000000000046")]
[ComImport]
public interface Application : _Application, AppEvents_Event
 Dan Ling14 июн. 2012 г., 21:27
Спасибо за четкое объяснение. Теперь я оставляю вопрос: «Почему?», Но я предполагаю, что хорошее понимание взаимодействия COM было бы необходимым условием для этого.
 Dan Ling14 июн. 2012 г., 23:26
Просто открыл его в dotPeek и убедился, что приложение украшено [CoClass (typeof (ApplicationClass))]].
 14 июн. 2012 г., 21:42
@jonnyGold: да, именно поэтому я не вставил ExcelApplication подпись для моего примера. Ответили в ответ с декомпилированной подписью.
 14 июн. 2012 г., 21:31
Мое необоснованное предположение состоит в том, что это был & # x201C; hack & # x201D; Внедрен в компилятор .NET исключительно для удовлетворения некоторых устаревших требований при взаимодействии с COM.
 14 июн. 2012 г., 21:32
В соответствии сthis Microsoft.Office.Interop.Excel.Application не украшенCoClassAttribute, но это должно быть. По общему признанию, я не использовал dotPeek на предполагаемом вопросе.

Ваш ответ на вопрос