Ответ 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