Предоставление вложенных массивов в COM из .NET - PullRequest
0 голосов
/ 16 сентября 2008

У меня есть метод в .NET (C #), который возвращает string[][]. При использовании RegAsm или TlbExp (из .NET 2.0 SDK) для создания библиотеки типов COM для содержащей сборки, я получаю следующее предупреждение:

ПРЕДУПРЕЖДЕНИЕ. Для вложенных массивов поддержка маршалинга отсутствует.

Это предупреждение приводит к тому, что рассматриваемый метод не экспортируется в сгенерированную библиотеку типов. Мне сказали, что есть способы обойти это, используя Variant в качестве типа возврата COM, а затем приведя / etc к стороне клиента COM. Для этой конкретной сборки целевой клиентской аудиторией является VB6. Но как вы на самом деле делаете это на стороне .NET?

Примечание : У меня есть существующая устаревшая DLL (с ​​экспортированной библиотекой типов), в которой тип возвращаемого значения - Variant, но эта DLL (и .tlb) генерируется с использованием устаревших инструментов до .NET, поэтому я не могу их использовать.

Поможет ли это вообще, если вместо этого сборка будет написана на VB.NET?

Ответы [ 2 ]

4 голосов
/ 16 сентября 2008

Даже если вы должны вернуть объект (который сопоставляется с вариантом в COM Interop), это не решит вашу проблему. VB сможет «удержать» его и «передать», но не сможет ничего с этим поделать.

Технически, в VB нет точного эквивалента для строки [] []. Однако, если ваш массив не является «зубчатым» (то есть все подмассивы имеют одинаковую длину), вы должны иметь возможность использовать двумерный массив в качестве возвращаемого типа. COM Interop должен быть в состоянии перевести это.

string [,] myReturnValue = new string[rowCount,colCount];

Независимо от того, формально ли ваш метод возвращает объект (который будет выглядеть как Variant для VB), или строку [,] (которая будет выглядеть как массив строк в VB), это несколько несущественно. Массив String является более хорошим возвращением, но не обязательным.

Если ваш массив является неровным, то вам придется придумать другой метод. Например, вы можете сделать свой возвращаемый 2D-массив таким же большим, как самый большой из под-массивов, а затем передать информацию о длине в отдельном параметре [out] int [], чтобы VB мог знать, какие элементы используются.

1 голос
/ 16 сентября 2008

Эквивалентом варианта в C # является System.Object. Поэтому вы можете попытаться вернуть приведенный результат объекту и забрать его обратно на другой стороне в качестве варианта.

VB не имеет никаких средств, которых нет в C #, поэтому я сомневаюсь, что было бы лучше или проще, если бы сторона .NET была написана на VB.

...