13 / 13 / 7
Регистрация: 04.10.2015
Сообщений: 27
1

Недопустимое сочетание управляемого и неуправляемого типов

29.11.2015, 18:28. Показов 4553. Ответов 3
Метки нет (Все метки)

Написал на C++ dll-ку:
C++
1
2
3
4
5
6
7
extern "C" __declspec(dllexport) double *mas (double Xmin, double Xmax, double i)
{
// инициализация параметров
double *masXY=new double[razm];
// действия над массивом
return masXY;
}
Далее пытаюсь подключить полученную библиотеку на C#, однако появляется следующая ошибка:
"Невозможно упаковать "return value": Недопустимое сочетание управляемого и неуправляемого типов."
C#
1
2
3
4
5
6
7
8
9
[DllImport("DynamicLibrary", CallingConvention = CallingConvention.Cdecl)]
        public static extern double[] mas(double Xmin, double Xmax, double i);
        static void ms()
{
// инициализация параметров
double[]p = new double[razmN];    
p = cpp_get_percent(Xmin, Xmax, i); // СТРОКА С ОШИБКОЙ
//
}
Как исправить эту ошибку?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2015, 18:28
Ответы с готовыми решениями:

Быстродействие управляемого и неуправляемого кода
начал изучать небезопасный код,написал прогу в ней 2 функции одна с управляемым кодом вторая...

Компиляция смешанного (управляемого и неуправляемого) кода
Здрасти. Подсобите люди добрые, нужно скомпилировать смешанный код. По всей видимости компилятору...

Взаимодействие управляемого и не управляемого кода
Есть проект Win32Project1 В Win32Project1 есть функция void Test() { MessageBox( 0,...

Заменить сочетание ABC на сочетание EFG в слове которое вводит исполнитель
Ребят срочно надо!!!!!

3
Администратор
Эксперт .NET
14844 / 11967 / 4812
Регистрация: 17.03.2014
Сообщений: 24,175
Записей в блоге: 1
04.12.2015, 00:40 2
Лучший ответ Сообщение было отмечено kokakolchik как решение

Решение

kokakolchik, в таком виде никак не исправить т.к. C# не может выяснить размер массива по указателю. Варианты по исправлению:
1) Выделять память на стороне .NET и передавать указатель в C функцию

2) Заменить тип возвращаемого значения на IntPtr и заниматься маршаллингом самому

3) Переделать API так чтобы размер массива был в одном из аргументов. Тогда можно будет указать SizeParamIndex у атрибута MarshalAs. По идее это должно работать в паре с [out] параметром.
1
13 / 13 / 7
Регистрация: 04.10.2015
Сообщений: 27
04.12.2015, 01:43  [ТС] 3
Cпасибо, помог второй пункт
0
Администратор
Эксперт .NET
14844 / 11967 / 4812
Регистрация: 17.03.2014
Сообщений: 24,175
Записей в блоге: 1
04.12.2015, 01:54 4
kokakolchik, это хорошо. Не забудь также про освобождение памяти. Освободить память выделеную под массив можно только с помощью delete[] внутри неуправляемого кода. То есть тебе понадобится еще один метод который нужно не забыть вызвать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2015, 01:54
Помогаю со студенческими работами здесь

опасности неуправляемого кода
какие опасности несет в себе неуправляемый код. На ум приходит только назначение переменным...

Подключение неуправляемого кода
Есть код на С++ struct auth_answer{ int TType; /**< тип транзакции. см...

Вызов неуправляемого кода из длл
Замучался с маршилингом! Есть функция в длл: RetCode = HMM_Path_Init( char *path ); RetCode –...

Поведение неуправляемого реактивного снаряда
Всем привет. Помогите пожалуйста! Задача такая (движение неуправляемого реактивного снаряда)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru