Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача структуры из dll c++ в с#. / 9 сообщений из 9, страница 1 из 1
23.06.2017, 03:21
    #39476511
npats2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
Всем привет!
есть функция в dll с++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
INT32 GetSupportDescription(Int32 Index, SUPPORT_DESCRIPTION* Description);

typedef struct
{
 INT32 CaptionID;
 INT32 DesID;
 WCHAR* Description;
}SUPPORT_DESCRIPTION;


в C# пишу
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
unsafe public struct SUPPORT_DESCRIPTION
        {
            public Int32 CaptionID;
            public Int32 DesID;
            public string Description;
        };

[DllImport("Work.dll", EntryPoint = "GetSupportDescription", SetLastError = true, CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true, CallingConvention = CallingConvention.Cdecl)]
unsafe public static extern Int32 GetSupportDescription(Int32 Index, SUPPORT_DESCRIPTION Description);
.
.
.
SUPPORT_DESCRIPTION des = new SUPPORT_DESCRIPTION();
GetSupportDescription(i, des); // здесь выдает ошибку "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."


unsafe режим включен
...
Рейтинг: 0 / 0
23.06.2017, 07:02
    #39476518
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        [StructLayout(LayoutKind.Sequential)]
        public struct SUPPORT_DESCRIPTION
        {
            public Int32 CaptionID;
            public Int32 DesID;

            [MarshalAs(UnmanagedType.LPWStr)] // или BStr, надо уточнять что там
            public string Description;
        };

        [DllImport("Work.dll")]
        public static extern Int32 GetSupportDescription(Int32 Index, ref SUPPORT_DESCRIPTION Description);
...
Рейтинг: 0 / 0
23.06.2017, 07:09
    #39476520
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
Ну и нужен пример вызова на С++, иначе не понятно как передавать строку Description. Вероятно стандартный маршалинг здесь не поможет, придётся описать строку как IntPtr и самостоятельно выделять и освобождать под неё память, самостоятельно преобразовывать её в managed string.
...
Рейтинг: 0 / 0
23.06.2017, 10:10
    #39476597
npats2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
Алексей К,
Dll стороннего разработчика, есть только описание выше.
...
Рейтинг: 0 / 0
23.06.2017, 10:27
    #39476609
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
npats2007Алексей К,
Dll стороннего разработчика, есть только описание выше.Судя по тому, что метод имеет префикс Get, то данные возвращаются из метода. Кто выделяет память под строку, вызывающий код или вызываемый метод? Как после вызова освобождается память, выделенная под строку, если она находится в динамической памяти?

Если подробности неизвестны, то надо пробовать. Класс Marshal должен помочь.

зы: Не самый удачный способ организации публичного С++ API.
...
Рейтинг: 0 / 0
23.06.2017, 10:45
    #39476619
npats2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
Алексей К,
Спасибо Алексей, буду с Marshal разбираться.
...
Рейтинг: 0 / 0
23.06.2017, 12:45
    #39476704
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
Вместо string должен быть StringBuilder:
Код: c#
1.
public StringBuilder Description;
...
Рейтинг: 0 / 0
23.06.2017, 12:48
    #39476708
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
petalvikВместо string должен быть StringBuilder:
Код: c#
1.
public StringBuilder Description;


Строки, используемые в структурах
авторСтроки являются допустимыми элементами структур, но буферы StringBuilder недопустимы в структурах
...
Рейтинг: 0 / 0
23.06.2017, 16:02
    #39476830
npats2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача структуры из dll c++ в с#.
petalvik,
При StringBuilder
Код: c#
1.
2.
3.
4.
5.
6.
7.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
unsafe public struct SUPPORT_DESCRIPTION
{
        public Int32 CaptionID;
        public Int32 DesID;
        public StringBuilder Desc;
};


Ошибка при вызове:
Невозможно упаковать поле "Desc" типа "Test.SUPPORT_DESCRIPTION": Поля структуры или класса не могут иметь тип StringBuilder. Тот же результат обычно достигается при использовании поля String и предварительной инициализации его строкой, длина которой совпадает с длиной соответствующего буфера.

Тут функция в структуру значение выводит, а не получает. Еще нюанс
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача структуры из dll c++ в с#. / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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