1

在使用 Office 互操作类时,我已经多次看到这种情况

this.CustomXMLParts.Add(MyResources.Data, new Office.CustomXMLSchemaCollection());

如果我将鼠标悬停在 CustomXMLSchemaCollection 类上,它会显示为一个界面。那我怎么可以做一个新的呢?是什么赋予了?顺便说一句,这段代码可以编译并工作。

4

1 回答 1

2

您不是在创建CustomXMLSchemaCollection接口的实例,而是创建CustomXMLSchemaCollectionClasscoclass 的实例。

接口的定义CustomXMLSchemaCollection是:

[Guid("000CDB02-0000-0000-C000-000000000046")]
[CoClass(typeof(CustomXMLSchemaCollectionClass))]
public interface CustomXMLSchemaCollection : _CustomXMLSchemaCollection
{
}

这意味着实现接口的指定 coclass 是CustomXMLSchemaCollectionClass. 我的猜测是,当 C# 编译器看到新的 forCustomXMLSchemaCollection接口时,它会将其转换为CustomXMLSchemaCollectionClass基于接口提供的属性创建一个 COM 实例。

写完这个简单的例子后:

namespace ConsoleApplication2
{
    using System;
    using Office = Microsoft.Office.Core;

    class Program
    {
        static void Main(string[] args)
        {
            Office.CustomXMLSchemaCollection test = new Office.CustomXMLSchemaCollection();
        }
    }
}

我刚刚运行了ildasm并获得了以下 MSIL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       8 (0x8)
  .maxstack  1
  .locals init ([0] class [Interop.Microsoft.Office.Core]Microsoft.Office.Core.CustomXMLSchemaCollection test)
  IL_0000:  nop
  IL_0001:  newobj     instance void [Interop.Microsoft.Office.Core]Microsoft.Office.Core.CustomXMLSchemaCollectionClass::.ctor()
  IL_0006:  stloc.0
  IL_0007:  ret
} // end of method Program::Main

如您所见,构造的类是CustomXMLSchemaCollectionClass为了证明我最初的假设。

于 2008-10-22T11:01:28.547 回答