Назначить вариант VB6 в объект - PullRequest
1 голос
/ 23 декабря 2009

У меня есть приложение VB6, которое использует скомпилированный C # Dll. Мне удалось сделать эту работу с помощью COM. Но моя проблема в том, что у меня есть массив Variant с типами данных String и Double. Мне нужно передать этот массив в мой C # Dll, который получает массив как объект. Итак, все, что мне нужно сделать, это преобразовать массив Variant в массив Object, «понятный» для C #. У кого-нибудь есть подсказка?

Ответы [ 4 ]

2 голосов
/ 23 декабря 2009

Это должно быть сделано прямо со стороны C # вещей; если нет, то с VB6 мало что можно сделать. Тем не менее, по умолчанию, метод объявлен так:

void Foo(object[] a);

будет рассматриваться из VB6 как принимающий массив Variant (или, на уровне IDL, как SAFEARRAY(VARIANT)).

Если это не работает для вас, значит, что-то не так с вашими объявлениями на C # - пожалуйста, опубликуйте их, чтобы они могли быть просмотрены.

2 голосов
/ 23 декабря 2009

Это должно сработать

ArrayList a = new ArrayList(YourObjectArrayHere);
0 голосов
/ 23 декабря 2009

Это объявление функции C #:

public double[][] CalcMatching( object[][] data1, object[][] data2, long dataLen1, long dataLen2, string matchingType )

Это вызов VB6:

result = matchingCalcObj.CalcMatching(data1, data2, dataLen1, dataLen2, Matching)

, где data1 и data2 - массивы Variant.

Я не думаю, что смогу многое сделать в C #, как вы, ребята, говорите, как только я получаю сообщение об ошибке при вызове функции «Недопустимый вызов процедуры или аргумент». Любой вариант на стороне VB6?

Спасибо за все ответы.

0 голосов
/ 23 декабря 2009

object [] System.Runtime.InteropServices.Marshal.GetObjectsForNativeVariants (IntPtr aSrcNativeVariant, int cVars)

Вы пробовали этот метод?

object[] result;
unsafe
{
  pin_ptr<object> pinObj = &obj;
  result = Marshal.GetObjectsForNativeVariants(new IntPtr(pinObj), objSize);
}

Сам не пробовал, но, похоже, сработает.

...