Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitОсвобожу память здесь по полученному указателю из DLL - это будет правильно??? Способ выделения памяти должен соответствовать способу её освобождения. Нельзя пришивать руку на место ноги. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 12:49 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbitа если я сделаю как писал выше C# Код: c# 1. 2. 3. Нельзя так делать, потому что разные менеджеры памяти по разному работают, если по-простому объяснять, то память не выделяется каждый раз, а просто выдается кусок ранее выделенной и делается отметка что кусок занят. Эти отметки разные менеджеры памяти делают по-разному. Поэтому освобождать память надо теми же средствами что и выделять, т.е. если выделил ее malloc() в С++, то и освободить надо вызовом free() в C++. Проще всего сделать как YuRock предложил, т.е. добавить в DLL функцию Код: plaintext 1. 2. 3. И ее вызвать из C# Код: c# 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 12:55 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Всем большое большое спасибо все понятно! Последний вопрос: В DLL мне надо string перевести в массив, на который я передаю указатель. 1. какой массив лучше принять в С# - байтовый или char? 2. как быть с символом конца строки - в DLL его записывать в массив или нет? в C# массив ведь нужно будет снова преобразовывать в строку. Как это правильно сделать? В общем у меня все вопросы сейчас крутятся вокруг темы обмена различными данными между managed и unmanaged кодом Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 15:48 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
string в С++ и C# разные вещи, первый в ANSI кодировках, второй с юникоде, поэтому лучше в C# принимать как массив байт, а затем конвертировать в строку. Код: plaintext 1. 2. По поводу нуля: он не нужен, если надо только записать для последующего чтения в C# ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 16:00 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbit1. какой массив лучше принять в С# - байтовый или char? 2. как быть с символом конца строки - в DLL его записывать в массив или нет? лучше сразу char(wchar_t, юникод UTF-16) использовать) нулевой терминатор - записывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 16:36 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbitа если я сделаю как писал выше C# Код: c# 1. 2. Я тут ничего не понимаю, увы. Но что могу сказать: ты из C# заранее не знаешь и знать не можешь, сколько тебе необходимо памяти выделить. Ну можно, конечно, с запасом полтора гига выделят каждый раз, но это не вариант) ArbitМне не хочется дважды обращаться к DLL - второй раз для очистки памяти. Обращаешься ты один раз - при загрузке библиотеки. Далее ты просто вызываешь функции, которые уже ничем не отличаются от функций твоей программы. Впрочем, как хочешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 16:40 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
если выделять память под строку через ::SysAllocString и принимать как BSTR - никакого дополнительного кода не нужно, маршаллер сам справится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 16:47 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 18:15 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, Сегодня мне счастье привалило, рад видеть! :) Читаю последний Ваш пост и в голове нестыковка по вопросу очистки памяти. Если я правильно понял, то очистка памяти в Вашем примере происходит не в том коде, в котором она выделялась Код: plaintext 1. 2. 3. 4. 5. Dimitry Sibiryakov и Дима Т в один голос говорят, что нужно чистить память там где она выделалась Ранее мы с Вами разбирали этот вопрос Изопропилкороче - возвращай из C - из сишного кода память выделенную CoTaskMemAlloc принимай в с# как IntPtr, Marshal.Copy - скопирует, Marshal.FreeCoTaskMem - освободит У меня это все работало и передавались данные (изображения) и нигде память не затиралась Говорят что мне просто везло Где-то я что-то напутал наверное. Проясните пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 19:52 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
YuRock, YuRockНо что могу сказать: ты из C# заранее не знаешь и знать не можешь, сколько тебе необходимо памяти выделить. Ну можно, конечно, с запасом полтора гига выделят каждый раз, но это не вариант) Не, память я выделяю в DLL и возвращаю в С# указатель на массив и его размер в параметре ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 19:55 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitDimitry Sibiryakov и Дима Т в один голос говорят, что нужно чистить память там где она выделалась это может упростить жизнь. Но если мы знаем, как память выделялась и как работает маршаллер(или вручную маршаллинг делаем) можно позволить себе выделять в одном месте, а освобождать в другом. главное чтоб единые распределители памяти использовались(CoTaskMemAlloc-CoTaskMemFree, SysAllocString-SysFreeString,GlobalAlloc-GlobalFree) ну а если случилось выделение malloc или new - только так, где выделяли освобождать следует. Например, массив, передаваемый по ссылке(ref) из c# кода маршаллером копируется в память, выделенную CoTaskMemAlloc. C-код в dll имеет полное право сделать CoTaskMemFree и CoTaskMemAlloc. а если строки передавались в массиве структур - то перед освобождением массива нужно ещё для строк сделать SysFreeString ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:11 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, авторArbit 1. какой массив лучше принять в С# - байтовый или char? 2. как быть с символом конца строки - в DLL его записывать в массив или нет? Изопропиллучше сразу char(wchar_t, юникод UTF-16) использовать) нулевой терминатор - записывать. Я сейчас передаю не короткие строки, а сериализованную XML строку с данными из базы для передачи их в DataTable Таблица в XML содержит 200-300 строк Такую большую XML строку тоже лучше передавать как массив char? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:19 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitТакую большую XML строку тоже лучше передавать как массив char?ну она не такая уж и большая. я бы string передал (и длину передавать не придётся) и в utf-16 сразу бы перекодировал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:25 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ArbitИзопропил, авторArbit 1. какой массив лучше принять в С# - байтовый или char? 2. как быть с символом конца строки - в DLL его записывать в массив или нет? пропущено... . Я сейчас передаю не короткие строки, а сериализованную XML строку с данными из базы для передачи их в DataTable Таблица в XML содержит 200-300 строк Такую большую XML строку тоже лучше передавать как массив char? Прикинь в байтах: 200-300 строк даже если каждая 1 Кб, это всего 0.2-0.3 Мб, ниочем. Передавай как передастся и не заморачивайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:29 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ИзопропилArbitDimitry Sibiryakov и Дима Т в один голос говорят, что нужно чистить память там где она выделалась это может упростить жизнь. Но если мы знаем, как память выделялась и как работает маршаллер(или вручную маршаллинг делаем) можно позволить себе выделять в одном месте, а освобождать в другом. главное чтоб единые распределители памяти использовались(CoTaskMemAlloc-CoTaskMemFree, SysAllocString-SysFreeString,GlobalAlloc-GlobalFree ) ну а если случилось выделение malloc или new - только так, где выделяли освобождать следует. Например, массив, передаваемый по ссылке(ref) из c# кода маршаллером копируется в память, выделенную CoTaskMemAlloc. C-код в dll имеет полное право сделать CoTaskMemFree и CoTaskMemAlloc. а если строки передавались в массиве структур - то перед освобождением массива нужно ещё для строк сделать SysFreeString Вот она - Квинтэссенция!!! Огромное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:35 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Dima T, Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:36 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
ИзопропилArbitТакую большую XML строку тоже лучше передавать как массив char?ну она не такая уж и большая. я бы string передал (и длину передавать не придётся) и в utf-16 сразу бы перекодировал Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:37 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Дорогие Гуру! Всем премного благодарен за помощь и внимание! Всем хорошего отдыха в грядущие выходные! Пошел ваять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 20:41 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Arbit, примечание - максимум вспомогательного кода лучше иметь на одной стороне ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 21:39 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
как же скучно я живу.... а тут столько эмоций на нечетном байте =( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 21:39 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, А что подразумевается под вспомогательным кодом? И на какой стороне его предпочтительнее иметь? С++ или С#? Вообще у меня основной код в DLL - работа с базой, вся промежуточная обработка данных перед и после базы В С# только код по работе с пользовательским интерфейсом ввод и отображение данных Да, еще в С# есть код по работе с моим сервером в интернете, но я его тоже перенесу в DLL (пока до этого руки еще не дошли) Спасибо за совет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 03:51 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
вспомогательный код - например вот Arbit Код: c# 1. 2. имеет отношение к маршаллингу, но не к решаемой прикладной задаче ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 08:30 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, Изопропилимеет отношение к маршаллингу, но не к решаемой прикладной задаче Да, я учту это. Спасибо большое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 10:47 |
|
||
|
Передача данных C# -> DLL С++ ->SQLite и обратно
|
|||
|---|---|---|---|
|
#18+
Изопропил, В итоге у получился такой вариант С++ Код: plaintext 1. 2. 3. 4. 5. 6. С# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Все работает, передаются любые объемы данных Теперь по очистке выделенной памяти: Память выделялась в С++ с помощью SysAllocString В С# маршаллер передал BSTR в string strXML А как теперь освободить память после заполнения DataTable? Есть Marshal.FreeCoTaskMem, Marsha.lFreeHGlobal, Marshal.FreeBSTR Но Marshal. SysFreeString не нашел Может - в данном случае это Marshal. FreeBSTR ? Или string strXML очистит сборщик мусора С#? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 15:25 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39514161&tid=2018092]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 266ms |

| 0 / 0 |
