Интерфейсы не могут быть созданы, но это исключение
Я очень удивлен, увидев, что мне действительно нужно создать интерфейс для использования Word Interoop в С#.
Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Application
в соответствии с его документацией по XML является интерфейсом:
![enter image description here]()
Как это возможно, визуальная студия путала это с чем-то еще? Или что позволяет создать этот интерфейс?
Ответы
Ответ 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
.