访问Excel文件时返回的C#系统.__ ComObject

我试图通过下面的代码访问Excel文件:

Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook book; Microsoft.Office.Interop.Excel.Worksheet sheet; Excel.Range range1 = null, range2 = null; CultureInfo ci = new CultureInfo("en-US"); Thread thisThread = Thread.CurrentThread; thisThread.CurrentCulture = new CultureInfo("en-US"); book = ObjExcel.Workbooks.Open(LinguisticInstructionsFileName); 

在variables的最后一行内容是System.__ComObject而在不同的应用程序代码工作和variables有...Excel.WorkbookClass

所以我想问一下这个奇怪的行为可能是什么原因。 我已经尝试调用Workbooks.Open与额外的Missing.Value参数,但结果是相同的。

.NET COM实现使用代理对象,这些代理是在内部生成的,并从System .__ ComObject派生,这是一个正常的行为。 它们是一种“dynamic的物体”。 您可以将__ComObject强制转换为您需要的接口或类。 您可以将其强制转换为WorkbookClass,而不会出现问题。

这一切都取决于你如何得到实例…如果你创build一个新的对象,例如new WorkbookClass ,C#将直接创build强types的对象。 相反,如果对象是从一个COM函数或属性返回的,它通常会返回一个__ComObject,这是因为__ComObject几乎是一切,可以被转换为几个接口,当然C#不知道该返回什么,所以它返回这个特殊的一种“dynamic”的对象。 这些对象称为RCW,代表运行时可调用包装器。

一个很好的阅读可以是http://www.codeproject.com/KB/cs/cominteropnet.aspx