我正在尝试通过以下代码访问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);
书籍变量的最后一行内容为System.__ComObject
,而不同的应用代码正在运行且变量为...Excel.WorkbookClass
。
所以我想问一下这种奇怪行为可能是什么原因。我已经尝试使用额外的Missing.Value args调用Workbooks.Open,但结果是一样的。
答案 0 :(得分:2)
.NET COM实现使用代理对象,这些代理在内部生成并从System .__ ComObject派生,因此这是正常行为。 它们是一种“动态对象”。 您可以将__ComObject强制转换为所需的接口或类。 您可以毫无问题地将其强制转换为WorkbookClass。
这一切都取决于你如何获得实例......如果用new创建一个对象,例如new WorkbookClass
,C#将直接创建强类型对象。
相反,如果对象是从COM函数或属性返回的,它通常返回一个__ComObject,这是因为__ComObject几乎可以是所有东西,并且可以被转换为多个接口,当然C#不知道要返回什么,所以它返回这个特殊的一种“动态”的对象。这些对象称为RCW,代表Runtime Callable Wrapper。
一个不错的阅读可以是http://www.codeproject.com/KB/cs/cominteropnet.aspx