Как передать байтовые массивы по ссылке в C# (в C-код в DLL)
У меня проблемы с выяснением, как передать массив байтов ввода / вывода из C# в подпрограмму C (которая находится в DLL). Под "I/O" я подразумеваю, что код C# хочет настроить данные в массиве, вызвать подпрограмму C и увидеть измененные данные в массиве, когда он вернется. (Использование Visual Studio 2008 на Win XP.)
Из разных источников мне говорили, что массивы в C# всегда передавались по ссылке... поэтому я надеялся, что "char [] buf" будет решением. Кажется, что это не так... кажется, что C# делает подлые вещи за моей спиной (например, передает копию данных?).
(Я искал, но не нашел полезного "C# для программистов на C", в котором обсуждается передача параметров из C# в C:)
(Если бы я мог определить, как получить адрес 'stemp' ниже в C#, я мог бы отобразить его до вызова кода C и после него... и отобразить входящий адрес в коде C).
Вот основной код C#:
[DllImport("c:/home/sieler/source/upshift.dll")]
internal static extern void ss_upshift1 (char [] buf, Int32 bytes);
static void Main(string[] args)
{
char [] stemp = new char [132];
string s;
s = "Testing\n\0";
stemp = s.ToCharArray ();
Console.WriteLine (stemp); // I see "Testing" on console window
ss_upshift1 (stemp, 7); // Inside the C routine, I see "Testing\n" and
// I change it to "TESTING\n"
Console.WriteLine (stemp); // I see "Testing", which is WRONG!
Когда я возвращаюсь из ss_upshift1, у 'stemp' все еще есть неизмененные данные (хотя я знаю, что данные были изменены... Я могу напечатать 'stemp' из подпрограммы C "ss_upshift1" до и после повышения!).
Если я сделаю параметр 'buf' 'out', то (а) я вижу нулевой буфер в коде C (как если бы C# говорил: "Я выделю вам новый буфер как копию" stemp ", и обнулить буфер, и передать его адрес), и если я помещу данные в буфер в C, код C# будет прерываться, когда я вернусь из ss_upshift1. (Если я не вставляю данные в C, ловушка не возникает (и нет полезные данные, конечно:).)
C# не имеет тега "io" (в отличие от "out" или "ref").
Если я сделаю параметр 'buf' равным 'ref', то C# отправит адрес адреса буфера (например, как char **buf в C). Код C может разыменовывать его, находить данные... но если данные изменены, вызывающий код C# НЕ видит измененные данные!
Итак, чтобы задать формальный вопрос: как передать массив байтовых данных из C# в C и получить обратно измененные данные?
спасибо Стэн