У меня есть старая библиотека 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 мог записывать в буфер?