remedius
Гость
|
|
« : 13-12-2006 10:51 » |
|
Здравствуйте! Есть бибилотека, написанная на с++. В ней экспортируется функция, возвращающая список. Как получить список в приложении c#? (соответсвенно, какой тип данных должно иметь возвращаемой значение импортируемой функции?
extern "C" __declspec(dllexport) ... my_function() //функция должна возвращать список
[DllImport("My_LIBRARY.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern ... my_function(); //функция, возвращающая список
Спасибо
|
|
« Последнее редактирование: 13-12-2006 10:59 от remedius »
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #1 : 13-12-2006 11:02 » |
|
Позвольте уточнить, что за список. Какой тип данных возвращается на С++?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
remedius
Гость
|
|
« Ответ #2 : 13-12-2006 11:03 » |
|
список структур (моих).
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #3 : 13-12-2006 11:05 » |
|
изначально был vector<>, но при экспорте данной функции, пришлось отказаться от шаблона с++. Теперь получается придется реализовывать свой список? если да, то все равно не совсем понятно, как потом его можно получить в приложении:(
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #4 : 13-12-2006 12:04 » |
|
предлагаю System.Object
[DllImport("My_LIBRARY.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern System.Object my_function(); //функция, возвращающая список
|
|
« Последнее редактирование: 13-12-2006 12:06 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
remedius
Гость
|
|
« Ответ #5 : 13-12-2006 12:05 » |
|
не поняла, а поподробнее можно рассказать?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #6 : 13-12-2006 12:07 » |
|
Я выше немного подправил исправил
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
remedius
Гость
|
|
« Ответ #7 : 13-12-2006 12:13 » |
|
Ок. 1.А возвращать из функции void*? 2. а что потом с object делать?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #8 : 13-12-2006 12:28 » |
|
Я сразу говорю я сам этого никогда не делал, а пробовать есть большое желание, но раньше вечера пятницы я не смогу. Познания в .НЕТ у меня невелики, поэтому мои предположения. Если тебя это устраивает, то можно продолжить педполагать. Возвращать надо не void*, а твой список,я бы для начала попробовал какой0нибудь простой класс. Затем ты при вызове этой функции получишь объект класса System.Object. А вот дальше вообще труба, не особо мне верится, что ничего не предпринимая ты сожешь работать с этим объектом как с экземпляром класса. Но стоит попробовать. По ошибкам станет видно. Я не имею прао просить тебя пробовать, но самому очень интересно, поэтому в пятницу вечером обязательно попробую.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #9 : 13-12-2006 12:41 » |
|
список структур (моих).
Что значит список структур ? Массив ? Поподробнее плизз, иначе нормального ответа дождаться будет трудно.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
remedius
Гость
|
|
« Ответ #10 : 13-12-2006 12:42 » |
|
массив или std::vector<my_struct>
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #11 : 13-12-2006 12:49 » |
|
Одно из решений: [DllImport("My_library.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern void GetGeometry(out MyStruct[] objs); MyStruct[] gos; GetGeometry( out gos);
extern "C" __declspec(dllexport)void my_function( MyStruct** gos)
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #12 : 13-12-2006 12:51 » |
|
Да, а кто память то освободит? неужели это будет на совести фреймворка?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #13 : 13-12-2006 12:53 » |
|
Ну раз Мороз пришел, значит дело заладится сейчас .
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #14 : 13-12-2006 13:37 » |
|
Да, а кто память то освободит? неужели это будет на совести фреймворка? Именно так. За освобождение памяти в фрэймворке отвечает GC ( Garbage Collector )
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
remedius
Гость
|
|
« Ответ #15 : 13-12-2006 13:39 » |
|
мм..так память выделялась в биллиотеке...
.. Я погорячилась. Предыдущий код не совсем верно работает. Длина возвращаемого массива всегда получается 1:(
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #16 : 13-12-2006 13:50 » |
|
Заработало: [DllImport("My_library.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int GetGeometry(out MyStruct* objs); MyStruct* gos; GetGeometry( out gos);
extern "C" __declspec(dllexport)int my_function( MyStruct** gos)
//но уже приходиться возвращать размер массива!!!
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #17 : 13-12-2006 13:54 » |
|
мм..так память выделялась в биллиотеке...
Видимо я не совсем точно объяснил. Память используемую в managed dll фрэймворк не освободит. Фрэймворк освобождает автоматически только свой ресурсы.
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
remedius
Гость
|
|
« Ответ #18 : 13-12-2006 13:56 » |
|
*наверно Вы имели ввиду в unmanaged ?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #19 : 13-12-2006 13:57 » |
|
Я что-то не понял, вот это вот На С# катит?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #20 : 13-12-2006 13:58 » |
|
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
|
nikedeforest
|
|
« Ответ #22 : 13-12-2006 14:03 » |
|
Мороз, а нельзя никак было бы через System.Object?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #23 : 13-12-2006 14:04 » |
|
Я что-то не понял, вот это вот На С# катит? Точнее катит, но только как : "Pointers may only be used in an unsafe context"
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #24 : 13-12-2006 14:11 » |
|
Мороз, а нельзя никак было бы через System.Object?
Сомневаюсь, но нужно тестить. Неизвестно что ты в итоге получиш в этот объект и сможеш ли кастить в нужную инфу. Тут без эксперементоа что то сказать для меня трудновато
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
remedius
Гость
|
|
« Ответ #25 : 13-12-2006 14:18 » |
|
nikedeforest, С Object у меня не получилось.
|
|
|
Записан
|
|
|
|
remedius
Гость
|
|
« Ответ #26 : 13-12-2006 14:19 » |
|
Возникла попутная проблема. Не получается передавать структуру:)
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #27 : 14-12-2006 05:18 » |
|
Возникла попутная проблема. Не получается передавать структуру:)
Передать структуру из C# в unmanaged dll ? Ну для этого надо сначала создать структуру на C#. Чтобы было реально её передать в unmanaged функцию, необходимо использовать атрибут [StructLayout]. Вот пример : using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)] public class MySystemTime { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; } class Win32API { [DllImport("Kernel32.dll")] public static extern void GetSystemTime(MySystemTime st); }
LayoutKind.Sequential - The members of the object are laid out sequentially, in the order in which they appear when exported to unmanaged memory.Можно использовать : LayoutKind.Explicit - The precise position of each member of an object in unmanaged memory is explicitly controlled. Each member must use the FieldOffsetAttribute to indicate the position of that field within the type. Вот пример : using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)] public struct Point { public int x; public int y; }
[StructLayout(LayoutKind.Explicit)] public struct Rect { [FieldOffset(0)] public int left; [FieldOffset(4)] public int top; [FieldOffset(8)] public int right; [FieldOffset(12)] public int bottom; }
class Win32API { [DllImport("User32.dll")] public static extern bool PtInRect(ref Rect r, Point p); }
|
|
« Последнее редактирование: 14-12-2006 05:25 от MOPO3 »
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
remedius
Гость
|
|
« Ответ #28 : 14-12-2006 07:05 » |
|
я делала что-то подобное, но у меня не удавалось передать структуру, где объявлены 2 string в структуре. (подряд, не подряд - без раазницы).
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #29 : 14-12-2006 07:48 » |
|
я делала что-то подобное, но у меня не удавалось передать структуру, где объявлены 2 string в структуре. (подряд, не подряд - без раазницы).
А если вместо string использовать массив char[] (string.ToCharArray()) ?
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
|