powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов неуправляемого кода из C# и получение массива.
12 сообщений из 12, страница 1 из 1
Вызов неуправляемого кода из C# и получение массива.
    #38616884
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некая dll и в ней нужная функция.
Функция принимает некий одномерный массив A типа double и размерностью N.
Код: c#
1.
var A = new double[N];


А возвращает другой массив B и той размерности, которой сочтет нужным. Т.е. заранее выделять память под массив B я не могу.
Код: c#
1.
double[] B;

- и больше ничего мне не известно!

Вопрос, как в функцию передать ссылку на массив B и после выполнения получить в C# полноценный массив?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[SuppressUnmanagedCodeSecurity]
internal static class MyFunkNative
{
    [DllImport("MyDll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, SetLastError = false)]
    internal static extern int MyFunk(
          [In] double[] A
        , [Out] double[] B
        );
}



Как использовать это не понятно. Если я пишу так:
Код: c#
1.
var ret = MyFunkNative.MyFunk(A, B);


то студия говорит, что В перед использованием должно быть инициализировано. Как то надо через ссылки сделать. Но вот как?
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38616889
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно делал такое с чужой аналогичной функцией возвращающей Double массив. Все проходило без проблем.
М.б. сигнатуру помtнять на С# типа f(double[] a[], out double[] B). В C# [out] в скобках не катит.
Можно попробовать f(double[] a[], ref double[] B).
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38616891
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, ошибся, после а [] конечно же не надо.
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38616902
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAНедавно делал такое с чужой аналогичной функцией возвращающей Double массив.
Ты этот массив перед вызовом как-то инициализировал? Можно кусок кода?
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38616915
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsafТы этот массив перед вызовом как-то инициализировал? Можно кусок кода?Нет, не инициализировал.
DLL цепляется по Референс, т.е. сигнатуры не надо. Кусок примерно такой.
Код: c#
1.
2.
3.
4.
double[] A; // =new double[] - это вроде не надо
A= f1(<список параметров>);
// была и такая
f2(<список параметров>, A); // там точно было в описании f2(<список параметров>,out double[] Data)

Собственно, и кода больше нет. Как то так.
C Double не нашел. Нашел подобное, но только со String
Код: c#
1.
2.
String[] SDataArr;
SDataArr = TStr.Split(SS, StringSplitOptions.RemoveEmptyEntries);
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38616932
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA, точно! Спасибо. Я что-то затупил. Вот код, который ошибки синтаксиса не дает.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public static class MyFunkNative
{
    public static void Start(ref double[] a, out double[] b)
    {
        MyFunk(a, out b);
    }


    [DllImport("FuncDll.dll", CharSet = CharSet.Auto)]
    private static extern void MyFunk([In] double[] a, [Out] out double[] b);
}



Завтра на работе проверю на работоспособность.
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38617305
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получилось.

В с++ память под массив выделяется. Массив заполняется нужными значениями (коллега выводит на консоль результаты). А вот при передаче массива обратно в C# лезет ошибка " Попытка чтения или записи в защищенную память. ".
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38617451
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsaf,

точную сигнатуру неуправляемой функции в студии.
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38617495
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да там ничего сложного. На С++ такое вот описалово.
Код: plaintext
1.
int MyFunk(double *A, double *В)
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38617587
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не. Наврал. Там такая сигнатура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
double MyFunk(double *A, double **B)
{
 *B = (double *)malloc(10*sizeof(double));
 printf("Memory for 'B' was allocated...\n\n");

 for (int i = 0; i < 10; i++) {  (*B)[i] = (double)i*2; }
 for (int i = 0; i < 10; i++) {   printf("B: %f\n", (*B)[i]); }
 return 0;
}



Для примера заполняется массив И значениями и выводится на экран
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38617601
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsafНе. Наврал. Там такая сигнатура:
Код: plaintext
1.
2.
3.
double MyFunk(double *A, double **B)
.....
}

Так ж там указатель на указатель.
...
Рейтинг: 0 / 0
Вызов неуправляемого кода из C# и получение массива.
    #38617603
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага. Я это уже понял. Сейчас С++ программист сделает обертку, чтобы был не указатель на указатель, а обычный указатель. Дурдом. Прямо "Война и немцы.". Потом отпишусь, что получилось.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов неуправляемого кода из C# и получение массива.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]