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

时间:2010-12-27 14:07:08

标签: c# com-interop

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

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

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

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

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

3 个答案:

答案 0 :(得分:9)

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

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

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

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

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

答案 1 :(得分:4)

使用

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

答案 2 :(得分:0)

这是一个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 Method

VS2010:

Object LinkSources(
    Object Type
)

VS2005:

public virtual Object LinkSources (
    [OptionalAttribute] Object Type
)