Каков наилучший способ скопировать строку в необработанный буфер памяти в C #?
Обратите внимание, что я уже знаю, как и когда использовать String и StringBuilder, так что не предлагайте этого;) код и более производительный, пока я могу получить данные в него. (Я имею в виду буферы редактора B-дерева и файлы с отображением в памяти, что плохо сопоставляется с управляемыми объектами C #, но легко кодируется с помощью указателей.)
Вещи, которые я уже рассмотрел:
C ++ / CLI может сделать то же самое, в vcclr.h есть PtrToStringChars, который затем может быть передан в memcpy, но я обычно предпочитаю иметь только одну сборку, а объединение IL из нескольких языков мне нравится избежать. Любой способ переписать эту функцию в C #?
System.Runtime.InteropServices.Marshal имеет функции, которые копируют строку, но только во вновь выделенный буфер. Не удалось найти функцию для копирования в существующий буфер.
Я мог бы использовать String.CopyTo и использовать массив вместо буфера памяти, но затем мне нужно много раз закрепить этот буфер (или сохранить его постоянно), что будет плохо для GC. (Используя буфер памяти в первую очередь, я могу выделить его вне управляемой кучи, чтобы он не мешал с GC.)
Если есть способ закрепить или скопировать StringBuilder, то это, вероятно, тоже сработает. Мой текст обычно приходит из файла или из StringBuilder, поэтому, если я уже могу переместить его в буфер памяти, ему никогда не нужно проходить через экземпляр String. (Обратите внимание, что переход от StringBuilder к String не имеет значения для производительности, поскольку он оптимизирован, чтобы не делать копию, если впоследствии вы перестанете использовать StringBuilder.)
Могу ли я генерировать IL, который прикрепляет String или StringBuilder? Тогда вместо написания функции копирования в C # я мог бы сгенерировать DynamicMethod, испустив требуемый IL. Только что подумал об этом, когда писал вопрос, поэтому я мог бы просто попытаться разобрать путь C ++ / CLI и воспроизвести IL.