C# 请解释为什么我能够实例化;申请书;Excel-VSTO中的接口

C# 请解释为什么我能够实例化;申请书;Excel-VSTO中的接口,c#,excel,vsto,C#,Excel,Vsto,我的应用程序中有以下C#代码,运行良好。它将启动一个新的Excel实例 private readonly Microsoft.Office.Interop.Excel.Application _application; _application = new Microsoft.Office.Interop.Excel.Application(); _application.Visible = true; 我最近才注意到这是一种接口类型。到底发生了什么,怎么可能呢?因为这样说: 例如,以下代码使

我的应用程序中有以下C#代码,运行良好。它将启动一个新的Excel实例

private readonly Microsoft.Office.Interop.Excel.Application _application;
_application = new Microsoft.Office.Interop.Excel.Application();
_application.Visible = true;
我最近才注意到这是一种接口类型。到底发生了什么,怎么可能呢?

因为这样说:

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


编译器允许您实例化接口,如果它们被一个属性修饰,该属性标识实现它们的具体类(以及a和a)。当实例化接口时,实际上是在幕后实例化这个具体类

此“功能”旨在用作COM导入类型的管道。请注意Outlook界面是如何由一个名为:

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

使用上述声明,您可以创建自己的
IFoo
接口的实例:

IFoo a = new IFoo();
Console.WriteLine(a.Bar());
// Output: "Hello world"
编辑:虽然正确地注意到Excel实例没有在MSDN上用
CoClass
修饰,但这似乎是MSDN遗漏。来自Microsoft.Office.Interop.Excel程序集的反编译签名是:

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

这不是一个令人满意的答案……MSDN还说“接口不能直接实例化。”同意。本文甚至没有解释这在语法上是如何有效的。图书馆文档也没有。谢谢你的清晰解释。我现在想知道“为什么?”,但我认为对COM互操作的良好理解是实现这一点的先决条件。我未经证实的猜测是,这是一次“黑客攻击”引入.NET编译器纯粹是为了在与COM进行互操作时解决一些遗留需求。根据
Microsoft.Office.Interop.Excel。应用程序
没有使用
CoClassAttribute
修饰,但必须使用。诚然,我没有在所讨论的问题上使用dotPeek。@jonnyGold:是的,这就是我没有粘贴Excel
应用程序的原因。以反编译签名回答。只需在dotPeek中打开它并验证应用程序是否用[CoClass(typeof(ApplicationClass))]修饰。
IFoo a = new IFoo();
Console.WriteLine(a.Bar());
// Output: "Hello world"
[CoClass(typeof(ApplicationClass)), Guid("000208D5-0000-0000-C000-000000000046")]
[ComImport]
public interface Application : _Application, AppEvents_Event