什么是我用COM互操作得到的`Object `类型?

我做C#excel互操作。 我从C#调用宏,我期待对象的数组。 我能够从返回二维数组的宏中获得二维对象数组。

但是,其他(第三方)宏应该返回一维数组。 我无法使(object[])xlApp.Run(...)工作(它抛出exception),调试器中的类型信息表示结果是Object[*]类型。 来自exception的实际消息是

 Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'. 

什么是Object[*]类型,如何从中检索一维数组?

编辑 :我想到这可能意味着SAFEARRAY的VARIANTS。 但随后出现了两个问题:为什么二维数组一切正常? 如何将SAFEARRAY转换为C#数组?

我填写了关于你的问题的各种文章:

OPCFondation:基本上不是将其声明为对象数组,而是可以将其声明为数组而不提供任何元素类型。 所以不要在Object []中使用数组,而是使用foreach循环来使用子数组。

 foreach(object subobject in (Array)myarrayitem) { //do stuff with the subobject, even browse further } 

此解决方案似乎有效,因为您可以在此处再次找到它。

在StackOverflow上 :他们谈论下限> 0的数组,它给你Object [*]类型,有一些链接可以对主题感兴趣,但我认为第一个想法是好的。

使用

 System.Array a = (System.Array)((object) returnedObject ); 

这就是PITA。 我在两个项目中有这个代码:

 Workbook wb = null; try { wb = excel.Workbooks.Open(filePath, false, true, 5, null, "WrongPAssword"); } catch { return false; } try { Array links = (Array)wb.LinkSources(XlLink.xlExcelLinks); if (links != null) { 

一个工作,另一个没有。 区别。 工作一个是针对.Net 2.0,另一个是.Net 4.0,它给出了错误:

无法将类型为’System.Object [*]’的对象强制转换为’System.Object []’。

如果您将本文的Visual Studio版本从VS2005更改为VS2010,则LinkSources数据类型会发生变化。

MSDN Workbook.LinkSources方法

VS2010:

 Object LinkSources( Object Type ) 

VS2005:

 public virtual Object LinkSources ( [OptionalAttribute] Object Type )