Как разделить большой байтовый массив между C ++ и C # - PullRequest
2 голосов
/ 23 декабря 2010

Мне нужно разделить огромный (много мегабайт) массив байтов между программой на C ++, находящейся в DLL, и программой на C #.

Мне нужна производительность в реальном времени, поэтому очень важно, чтобы я мог эффективно делить ее между ними, поэтому создание новой копии для нее в C # каждый раз после манипулирования данными в C ++ не вариант, однако примеры, которые я нашел до сих пор, похоже, зависят от этого.

Можно ли эффективно использовать массив? И если да, то как?

Ответы [ 4 ]

4 голосов
/ 23 декабря 2010

В текущих версиях .NET любой мультимегабайтный массив окажется в куче больших объектов и никогда не будет перемещаться. Однако, чтобы быть в безопасности, вы должны закрепить массив, как сказал fejesjoco. Затем код C ++ может сохранить указатель в массив .NET и обновить его на месте.

2 голосов
/ 23 декабря 2010

Использовать отображенный в памяти файл. System.IO.MemoryMappedFiles в .NET и CreateFileMapping в C ++.

1 голос
/ 23 декабря 2010

Маршалер .NET передает копию, а не ссылку? Если это так, то вызовите GCHandle.Alloc (array, GCHandleType.Pinned), затем вы можете получить адрес этого закрепленного объекта и передать его в DLL в качестве указателя.

0 голосов
/ 23 декабря 2010

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

...