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

Интерфейсы не могут быть созданы, но это исключение

Я очень удивлен, увидев, что мне действительно нужно создать интерфейс для использования Word Interoop в С#.

Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();

Microsoft.Office.Interop.Word.Application в соответствии с его документацией по XML является интерфейсом:

enter image description here

Как это возможно, визуальная студия путала это с чем-то еще? Или что позволяет создать этот интерфейс?

4b9b3361

Ответ 1

Это потому, что это COM-интерфейс. Интерфейсы COM - и только COM-интерфейсы - могут быть созданы напрямую. Среда выполнения создаст экземпляр реального типа за кулисами. Лично я думаю, что это немного уродливо (и я не могу найти ссылки на него в спецификации С#), но мы идем.

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

Ответ 2

Вы не можете создать interface в С# по определению, а Application - не обычный .NET interface, а COM-интерфейс. Из MSDN:

Это интерфейс .NET, полученный из COM-класса, который требуется управляемым кодом для взаимодействия с соответствующим COM объект.

Теперь вы, вероятно, спрашиваете себя:

Хорошо, когда компилятор С# идентифицирует, что атрибут System.Runtime.InteropServices.CoClass украшает interface, он автоматически будет использовать Activator.CreateInstance на предоставленном type из CoClass, например:

[System.Runtime.InteropServices.CoClass(typeof(Test))] - Таким образом будет создан новый экземпляр Test.