【问题标题】: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# 中实例化 interfaceApplication不是常规的 .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

    【讨论】:

    • 在我看来你是真正的 C# 王
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多