Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2017, 14:59   #1
bnetrealm
Новичок
Джуниор
 
Регистрация: 22.06.2017
Сообщений: 1
По умолчанию Проблема с маршаллингом между C#-exe и С++-dll

Приветствую.
Имеется такой код (C#, exe), который обращается к C++ дллке (не /clr!), перекидывает ей структуру, чтобы та в свою очередь заполнила эту структуру данными и вернула её соответственно обратно в C# exe: https://pastebin.com/DPuBeqBX
После того, как было добавлено (так как появилась необходимость получить список файлов в торренте и отдать его вместе с базовыми данными по нему, которые уже и так возвращаются нормально) в C# TorrentInfoType структуру вот этот кусок (и в С++ часть свой аналог - std::vector<TorrentInfoType_FilesLi st>... - соответственно тоже):
Код:
// Files list in .torrent
[MarshalAs(UnmanagedType.LPArray)]
public TorrentInfoType_FilesList[] files;
Это стало продуцировать на этой строке:
Код:
int tempSize = Marshal.SizeOf(typeof(TorrentInfoType));
...вот такую ошибку: Marshal.SizeOf - cannot be marshaled as an unmanaged structure…

Укажите пожалуйста, что не делаю не так в этой ситуации? :-\
Наверное многое, ибо всего 3-4 месяца изучаю C# с С++, так что не пинайте сильно пжалста

И просто для референса, на стороне С++ структуры выглядят так: https://pastebin.com/43RDUdQx

И потом в С++ной части в функции dll_TorrentGetInfo я вызываю функцию для копирования в структуру которая потом возвращается в C#:
Код:
void TorrentInfo::CopyInfo(TorrentInfoType* dest) const
{
  dest->IsValid      = IsValid();
  dest->name         = _wcsdup(GetNameW().c_str());
  dest->hash         = _wcsdup(GetHashW().c_str());
  dest->creationDate = GetCreationDate();
  dest->creator      = _wcsdup(GetCreatorW().c_str());
  dest->comment      = _wcsdup(GetCommentW().c_str());
  dest->IsPrivate    = IsPrivate();
  dest->totalSize    = GetTotalSize();
  dest->filesCount   = GetFilesCount();
  dest->pieceLength  = GetPieceLength();
  dest->piecesCount  = GetPiecesCount();    

  // TODO: Fill files list.
  // ...
}

Последний раз редактировалось bnetrealm; 22.06.2017 в 15:05.
bnetrealm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 03:18
DLL<->Exe AndXor Общие вопросы Delphi 22 01.10.2013 17:31
Шифрования exe внешней утилитой между метками. Winexcel Общие вопросы Delphi 15 30.09.2013 19:55
Передать че-нибудь в DLL / Из DLL прочитать переменную EXE WhiskasTM Общие вопросы Delphi 9 02.08.2012 13:33
Запуск Load.dll (бывшая Load.exe) в дереве проц-ов, Как запустить прогой на C# .dll-ку kapustin Общие вопросы .NET 10 23.09.2009 22:20