接口无法实例化,但这是一个例外

时间:2014-05-20 14:55:00

标签: c# interface com office-interop

在看到我实际需要实例化一个接口以在C#中使用Word Interoop后,我感到非常惊讶。

Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();

根据XML文档所说的Microsoft.Office.Interop.Word.Application是一个接口:

enter image description here

视觉工作室是否有可能将其与其他东西混淆?或者是什么允许实例化这个接口?

2 个答案:

答案 0 :(得分:14)

这是因为它是一个COM接口。 COM接口 - 和 COM接口 - 可以直接实例化。运行时将在后台创建 real 类型的实例。我个人觉得它有点难看(我不能在C#规范中找到对它的任何引用)但是我们去了。

您实际上可以伪造这样,以便C#编译器会认为您的界面是COM类型而没有正确地参与COM ...有关详细信息,请参阅my related question

答案 1 :(得分:3)

您无法按照定义在c#中实例化interfaceApplication 常规.NET interface,但是一个COM接口。来自MSDN

  

这是一个从需要的COM coclass派生的.NET接口   通过托管代码实现与相应COM的互操作性   对象

现在,你可能会问自己怎么样?

好吧,当C#编译器确定System.Runtime.InteropServices.CoClass属性正在装饰interface时,它会自动使用Activator.CreateInstance来自CoClasstype }属性,例如:

[System.Runtime.InteropServices.CoClass(typeof(Test))] - 因此,将创建Test的新实例。