Как передать байтовые массивы по ссылке в 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 и получить обратно измененные данные?

спасибо Стэн

0 ответов

Другие вопросы по тегам