Member 13797060 Ответов: 2

Проблема библиотеки DLL Vb to C#


Привет.
С некоторых пор я безуспешно пытаюсь решить эту проблему.
Любая помощь будет очень признательна.

У меня есть внешняя библиотека DLL с необходимыми методами, чтобы сделать некоторые вычисления на входах и дает мне выход (у меня нет доступа к коду)
------------------------------------------------------
Рабочим скриптом excel VB для вызова этой библиотеки является
Dim Inputs() As Double
Dim Outputs() As Variant
ReDim Inputs(1 To 1, 1 To NbrInputs&)
For i& = 1 To NbrInputs&
Inputs(1, i&) = CDbl(InRange(i&).Value)
Next i&

ABC.CalculateMatrix(Inputs#, Outputs)

------------------------------------------

У меня большие проблемы с взаимодействием библиотеки С C#
метод должен быть написан на языке Си#
АЗБУКА.CalculateMatrix(ref System.Массив, Реф-система.Массив)
Входные и выходные массивы, похоже, не работают.Я перепробовал почти все

Что я уже пробовал:

Double[] Inputs = new Double[4];
Object[] Outputs = new Object[1]; 
ABC.CalculateMatrix(Inputs, Outputs);

И ошибка, которую я получаю, такова:
Система.Время Выполнения.InteropServices.Исключение comexception'
Объектная переменная или с неустановленной блочной переменной

2 Ответов

Рейтинг:
1

Richard Deeming

Цитата:
ReDim Inputs(1 To 1, 1 To NbrInputs&)

Это создает двумерный массив с ненулевой нижней границей. Чтобы продублировать это в C#, вам понадобится:
Array Inputs = Array.CreateInstance(
    typeof(double), 
    new[] { 1, NbrInputs }, // lengths
    new[] { 1, 1 });        // lower bounds

for (int i = 1; i <= NbrInputs; i++)
{
    double value = Convert.ToDouble(InRange[i].Value);
    
    // NB: Can't use indexer to set the value for a non-zero lower bound:
    Inputs.SetValue(value, 1, i);
}

Из опубликованного вами кода неясно, что именно должно быть передано в систему. Outputs параметр. Вам нужно будет проверить документацию стороннего кода, чтобы увидеть, дает ли это вам какие-либо подсказки.


Maciej Los

Ястребиный глаз!
Я упустил из виду, что это двумерный массив!

Member 13797060

Библиотека DLL была написана, вероятно, в VB уже довольно давно, 2012

Member 13797060

Только использование этого типа варианта дает мне другую ошибку в c#

динамический выход=новая динамика[3];

Элемент „объект” не содержит функции CalculateMatrix

Рейтинг:
1

User 7429338

АЗБУКА.CalculateMatrix ожидает ссылок:

System.Array Inputs = Array.CreateInstance(typeof(Double), 4);
System.Array Outputs = Array.CreateInstance(typeof(Object), 1);
ABC.CalculateMatrix(ref Inputs, ref Outputs);


Member 13797060

//После изменения на ABC.CalculateMatrix(арт входы, выходы Реф );
Я получаю следующие ошибки:

не удается преобразовать из 'ref double[]' в 'ref System.Массив'
не удается преобразовать из 'ref object[]' в 'ref System.Массив'

[no name]

Вы можете использовать массив.CreateInstance для создания массивов правильного типа в этом случае. Я обновил свой первоначальный ответ примером.

Member 13797060

После изменения на

System.Array Inputs = Array.CreateInstance(typeof(Double), 4);
System.Array Outputs = Array.CreateInstance(typeof(Object), 1);
ABC.CalculateMatrix(ref Inputs, ref Outputs);

Я получаю следующую ошибку
Объектная переменная или с неустановленной блочной переменной

[no name]

Это похоже на ошибку VB, вызванную ABC.CalculateMatrix, а не проблема с способом вызова из C#. Я надеюсь, что кто-то еще сможет помочь с частью VB, так как у меня нет опыта в этом.