C# System.__ComObject 访问 Excel 文件时返回

Pio*_*lav 5 c# excel 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);
Run Code Online (Sandbox Code Playgroud)

book 变量的最后一行内容是System.__ComObject在不同的应用程序代码中工作且变量具有...Excel.WorkbookClass

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

Sal*_*iti 2

.NET COM 实现使用代理对象,这些代理是内部生成的并派生自 System.__ComObject,因此这是正常行为。它们是一种“动态对象”。您可以将 __ComObject 强制转换为您需要的接口或类。您可以毫无问题地将其转换为 WorkbookClass。

这完全取决于您如何获取实例...如果您使用 new 创建对象,例如,new WorkbookClassC# 将直接创建强类型对象。相反,如果对象是从 COM 函数或属性返回的,则它通常返回 __ComObject,这是因为 __ComObject 几乎可以是所有内容,并且可以转换为多个接口,当然 C# 不知道要返回什么,因此它返回这个特殊的一种“动态”对象。这些对象称为 RCW,代表运行时可调用包装器。

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