Как обойти ограничение длины Marshal.Copy (32bit)? - PullRequest
9 голосов
/ 02 февраля 2012

Я пытаюсь переместить данные назад / вперед между управляемым (C #) и неуправляемым (C ++ Win32) кодом. Я могу использовать Marshal.Copy, и он будет отлично работать, пока наборы данных не станут больше> 2 ГБ, так как Marshal.Copy имеет 32-разрядное ограничение int (2 ГБ) со знаком для длины.

Есть идеи, как обойти это? В настоящее время я использую AllocHGlobal(IntPtr) на управляемой стороне и .ToPointer() на неуправляемой стороне. Если я не могу использовать Marshal.Copy для перемещения больших данных (> 2 ГБ) вперед / назад, что я могу использовать?

1 Ответ

2 голосов
/ 15 февраля 2012

Моя первая реакция была: почему вы копируете 2 ГБ + данных?

Возможно, ограничения вашего приложения не позволят этого, но мне кажется, что если ваш набор данных больше, чем разрешено фреймворком, вам не следует искать хитрости, чтобы обойти фреймворк. Как насчет другого способа доступа вообще?

Существует множество способов решения этой проблемы. Для начала вы можете обернуть память в поток и вытянуть данные в неуправляемый код. Вы также можете создать свой собственный интерфейс для доставки данных по частям. Вспоминаются файлы с памятью.

Не зная конкретных ограничений приложения, возможно, вы не сможете изменить неуправляемый код, я бы посоветовал найти другой метод, а не обходить рамки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...