powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача структуры из dll c++ в с#.
9 сообщений из 9, страница 1 из 1
Передача структуры из dll c++ в с#.
    #39476511
npats2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
есть функция в 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
Передача структуры из dll c++ в с#.
    #39476518
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Передача структуры из dll c++ в с#.
    #39476520
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и нужен пример вызова на С++, иначе не понятно как передавать строку Description. Вероятно стандартный маршалинг здесь не поможет, придётся описать строку как IntPtr и самостоятельно выделять и освобождать под неё память, самостоятельно преобразовывать её в managed string.
...
Рейтинг: 0 / 0
Передача структуры из dll c++ в с#.
    #39476597
npats2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,
Dll стороннего разработчика, есть только описание выше.
...
Рейтинг: 0 / 0
Передача структуры из dll c++ в с#.
    #39476609
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
npats2007Алексей К,
Dll стороннего разработчика, есть только описание выше.Судя по тому, что метод имеет префикс Get, то данные возвращаются из метода. Кто выделяет память под строку, вызывающий код или вызываемый метод? Как после вызова освобождается память, выделенная под строку, если она находится в динамической памяти?

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

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


Строки, используемые в структурах
авторСтроки являются допустимыми элементами структур, но буферы StringBuilder недопустимы в структурах
...
Рейтинг: 0 / 0
Передача структуры из dll c++ в с#.
    #39476830
npats2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача структуры из dll c++ в с#.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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