请解释为什么我能够在Excel VSTO中实例化“应用程序”界面

我有我的应用程序中的以下C#代码,它工作得很好。 它启动了一个新的Excel实例。

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

我只是最近才注意到Application是一个接口types。 究竟发生了什么事,怎么可能呢?

如果编译器使用CoClass属性来标识实现它们的具体类(以及ComImportGuid ),则编译器允许您实例化接口。 当你实例化接口的时候,你实际上是在幕后实例化这个具体的类。

此“function”旨在用作COM导入types的pipe道。 注意Outlook Application接口是如何由名为ApplicationClass的具体类来支持的:

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

在大多数情况下,你不应该将这些属性应用到你自己的接口。 但是,为了演示,我们可以certificate编译器允许您利用这种可能性来实例化代码中的接口。 考虑下面的简单例子(GUID是随机的):

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

使用上面的声明,你可以创build你自己的IFoo接口的实例:

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

编辑 :尽pipejonnyGold正确地注意到Excel Application实例没有用MSDN上的CoClass装饰,这似乎是一个MSDN省略。 从Microsoft.Office.Interop.Excel程序集反编译签名是:

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

因为MSDN这样说:

例如,下面的代码使用Excel Microsoft.Office.Interop.Excel.Application接口。 在运行时,它使用Application类来实例化Excel应用程序对象并打开工作表。