我有一个旧的C dll,我需要用C#代码包装。我使用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结构中的缓冲区字段只是一个指向我在客户端代码中初始化的char数组的指针。使用指针,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可以写入缓冲区吗?