3

我正在尝试通过以下代码访问 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);

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

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

4

1 回答 1

2

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

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

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

于 2011-11-21T12:33:06.120 回答