将带有嵌入字符串的struct传递给C dll时,C#P / Invoke不起作用

时间:2011-01-02 01:05:15

标签: c# pinvoke

我有一个旧的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可以写入缓冲区吗?

1 个答案:

答案 0 :(得分:-1)

This示例应该让您走上正确的道路。