这个“Object[*]”类型是使用COM互操作时得到的吗?

10

我在进行C#与Excel的互操作时,我从C#调用宏,并期望得到对象数组。我能够从返回2维数组的宏中获取到2维对象数组。

不过,另一个(第三方)宏应该返回一个一维数组。我无法让(object[])xlApp.Run(...)正常工作(它会引发异常),并且调试器中的类型信息显示结果的类型为Object[*]。异常的实际消息是

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

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

编辑:我想到这可能意味着一个VARIANT的SAFEARRAY。但是,两个问题出现了:为什么二维数组没有问题?如何将SAFEARRAY转换为C#数组?

3个回答

9
我找到了一些关于你问题的文章:

OPCFondation :基本上,你可以将其声明为一个数组,而不是对象数组,不需要提供任何元素类型。因此,不要将其强制转换为Object[],而是使用Array,并使用foreach循环来使用子数组。

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

这个解决方案似乎可行,因为你可以在这里找到它。

在StackOverflow上:他们谈论的是下限大于0的数组,这会给你Object [*]类型,并提供了一些有关该主题的有趣链接,但我认为第一个想法是正确的。


4
使用
System.Array a = (System.Array)((object)  returnedObject );

0

这真是个让人头疼的问题。我在两个项目中都有这段代码:

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 Method

VS2010:

Object LinkSources(
    Object Type
)

VS2005:

public virtual Object LinkSources (
    [OptionalAttribute] Object Type
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接