为什么这个代码在C#中工作(Excel自动化问题)

嗨,大家好,

首先让我告诉你,我不认为我是一个非常糟糕的编码器。 是的,我不是一个极端的编码器,但我可以编写足够的代码来使系统工作。

最近几天,我被赋予自动执行微软excel自动化任务的责任。 由于截止date太短,所以我没有去“ 阅读手册 – 做工作 ”的风格….我直接在谷歌search,发现了一些代码段,并使用这些。

代码工作完美,它只用了3.2分钟就取代了我们的9小时工作负载….通过这个任务,我已经成功地获得了关于办公自动化的较深层次的知识,但是今天当我得到请假时,我试图挖掘关于代码,我错过了由于直接复制+使用从谷歌。

第一行创造了所有的问题……它是:

using Excel = Microsoft.Office.Interop.Excel; Excel.Application application; application= new Excel.Application(); 

这里应用程序是一个接口……….那么我怎么实例化一个接口? 我找不出解决办法。 这真的是杀了我

接口不能实例化…那么为什么这个代码工作? 有谁知道 ???

任何答复都将是令人满意的。

Excel.Application接口在inter-op程序集中声明。 如果你看到它的定义,接口将被装饰成GUID和一个CoClass属性( CoClass(typeof(ApplicationClass)) )。 由于这个属性,代码行

 application= new Excel.Application(); 

将实际上被翻译成

 application= new Excel.ApplicationClass(); 

ApplicationClass是一个简单的.NET类,已经使用interop属性进行了修饰,以便所有调用(包括构造)都将被转发到实际的COM组件。 通常情况下,互操作程序集会创build用于COM组件的导入types库。 有关COMtypes如何映射到.NETtypes的更多信息,请参阅这篇文章。

编辑:只是做了一些谷歌search额外的信息包括在post中,并在SO上遇到同样的问题 。 特别是在Eric Lippert的回答中,他解释了在接口上使用新操作符时编译器的逻辑。