Что это за `Object [*]` тип, который я получаю с помощью COM-взаимодействия?

Я делаю С# excel interop. Я вызываю макросы из С#, и я ожидаю массивы объектов. Я могу получить 2-мерные массивы объектов из макросов, которые возвращают 2-мерные массивы.

Однако другой (сторонний) макрос должен возвращать одномерный массив. Я не могу заставить (object[])xlApp.Run(...) работать (он генерирует исключение), а информация типа в отладчике говорит, что результат имеет тип Object[*]. Фактическое сообщение из исключения

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

Что это за тип Object[*] и как получить из него одномерный массив?

EDIT. Мне пришло в голову, что это может означать SAFEARRAY of VARIANTS. Но тогда возникают два вопроса: почему все нормально с двумерными массивами? Как преобразовать SAFEARRAY в массив С#?

Ответ 1

Я собираю различные статьи о вашей проблеме:

OPCFondation: В основном вместо того, чтобы объявлять его как массив объектов, вы можете просто объявить его как массив без предоставления какого-либо типа элемента. Поэтому не используйте в Object [], но Array, и используйте цикл foreach для использования подмассива.

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

Это решение работает, так как вы можете найти его снова здесь.

fooobar.com/questions/506111/...: они говорят о массивах с нижней границей > 0, что дает вам тип Object [*], с некоторыми ссылками, которые могут быть интересны по предмету, но я думаю, что первая идея - хорошая.

Ответ 2

Используйте

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

Ответ 3

Это была такая ПИТА. У меня был этот код в двух проектах:

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
)