C # P / Invoke не работает при передаче структуры со встроенной строкой в ​​C dll - PullRequest
1 голос
/ 02 января 2011

У меня есть старая библиотека Cll, которую нужно обернуть кодом C #. Я использовал takeit подписи P / Invoke, чтобы получить следующее определение структуры:

    [StructLayout(LayoutKind.Sequential)]
    internal struct SDRMSG
    {
        public uint Stream;
        public uint Function;
        public uint Wbit;
        public int Length;
        [MarshalAsAttribute(UnmanagedType.LPStr)]
        public string Buffer;
        public int Error;
        public int Next;
        [MarshalAsAttribute(UnmanagedType.LPStr)]
        public string Txtp;
        public int Txtc;
        [MarshalAsAttribute(UnmanagedType.LPStr)]
        public string Wtxtp;
        public int Wtxtc;
    }

из исходного определения C:

typedef struct {
     unsigned int  stream;
     unsigned int  function;
     unsigned int  wbit;
     SDRLENGTH     length;
     unsigned char * buffer;

     SDRLENGTH     error;
     int           next;
     unsigned char * txtp;
     SDRLENGTH     txtc;
     unsigned char * wtxtp;
     SDRLENGTH     wtxtc;
 } SDRMSG;

Что происходит, мне нужно инициализировать эту структуру и отправить ее в C .dll, где .dll заполнит поле буфера данными. Поле буфера в исходной структуре C было просто указателем на массив символов, который я инициализировал в своем клиентском коде. Вооруженный указателем, C .dll смог записать прямо в буфер. Я пытаюсь получить тот же результат с кодом C #, но независимо от того, что я пытаюсь, мне не удается правильно инициализировать поле буфера, чтобы C .dll мог заполнить его данными. Он всегда возвращается к моему клиентскому коду пустым. Вот одна попытка (среди нескольких других, которые я не могу вспомнить), которая, кажется, не работает.

        secsMessage.Stream = 1;
        secsMessage.Function = 13;
        secsMessage.Wbit = 1;
        secsMessage.Length = 8000;
        secsMessage.Buffer = new string('\0', 8000);

Может кто-нибудь помочь мне выяснить, как инициализировать структуру, чтобы C .dll мог записывать в буфер?

1 Ответ

0 голосов
/ 02 января 2011

Этот пример должен указать вам правильный путь.

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