Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: marshalas int* в int[]  (Прочитано 4418 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Serguntii
Помогающий

ru
Offline Offline

« : 09-11-2013 07:52 » 

Помогите пожалуйста простую задачку решить.
В dll на с++  вызов функции foo происходит так
Код:
....
public: void fooV([MarshalAs(UnmanagedType::LPArray, SizeConst=12)] int[] num)  //как это правильно сделать?
            {                   
                foo(num);   // void foo(int* num)           
            }

...
Вызывать ее нужно в C# в управляемом коде.  
Код в с#
Код:
.....
int[] num = new int[12];

classdll.foo( num);

« Последнее редактирование: 09-11-2013 09:47 от sergeyan » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 09-11-2013 10:20 » 

Что-то ты нагородил всего.

Во-первых, нужно знать, какой код на C++: .NET или нет.

Если это код .NET, то и типы должны быть .NET. В данном случае
Код: (C++)
array<int> ^num
size передавать бессмысленно по той причине, что он и так хранится внутри массива и доступен по свойству Length.

Если это код не .NET, то типы должны быть C++. В данном случае
Код: (C++)
int *num
Опять же, указание размера большого смысла не имеет, поскольку массив всегда (кроме статических массивов в структурах) передаётся по указателю. Но если так хочется, то можно и указать
Код: (C++)
int num[12]

Однако для вызова такого кода нужно будет, во-первых, объявить декларацию экспорта из DLL:
Код: (C++)
extern "C" void _declspec(dllexport) fooV(int *num)
И при этом функция должна быть оформлена на языке C: не может быть членом класса и использовать классы в параметрах.

Во-вторых, импортировать её в C#:
Код: (C#)
[DllImport("my.dll")]
static extern void fooV(int[] num);
« Последнее редактирование: 09-11-2013 10:36 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #2 : 09-11-2013 13:46 » new

Спасибо все получилось ) вот нужно было
Код:
array<int> ^num
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines