请解释为什么我能够在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
属性来标识实现它们的具体类(以及ComImport
和Guid
),则编译器允许您实例化接口。 当你实例化接口的时候,你实际上是在幕后实例化这个具体的类。
此“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应用程序对象并打开工作表。