【问题标题】:Interfaces can't be instantiated but is this an exception [duplicate]接口不能被实例化,但这是一个例外[重复]
【发布时间】:2014-07-08 22:02:42
【问题描述】:
看到我实际上必须实例化一个接口才能在 C# 中使用 Word 互操作,我感到非常惊讶。
Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Application 根据它的 XML 文档所说是一个接口:
这怎么可能,视觉工作室是否将它与其他东西混淆了?或者是什么允许这个接口被实例化?
【问题讨论】:
标签:
c#
interface
com
office-interop
【解决方案1】:
根据定义,您不能在 c# 中实例化 interface,Application不是常规的 .NET interface,而是 COM 接口。来自MSDN:
这是一个从 COM coclass 派生的 .NET 接口,它是必需的
通过托管代码与相应的 COM 互操作
对象。
现在,您可能会问自己是怎么来的?
好吧,当 C# 编译器识别出 System.Runtime.InteropServices.CoClass 属性正在修饰 interface 时,它将自动在 CoClass 属性中提供的 Activator.CreateInstance 上使用 Activator.CreateInstance,例如:
[System.Runtime.InteropServices.CoClass(typeof(Test))] -
因此将创建一个新的Test 实例。
【解决方案2】:
因为它是一个 COM 接口。 COM 接口 - 仅 COM 接口 - 可以直接实例化。运行时将在幕后创建 real 类型的实例。就我个人而言,我认为它有点难看(而且我在 C# 规范中找不到任何对它的引用),但我们去吧。
你实际上可以伪造这个,这样 C# 编译器就会认为你的接口是一个 COM 类型,而不需要正确地涉及 COM...有关详细信息,请参阅 my related question。