C# PInvoke out strings declaration

后端 未结 2 1965
天命终不由人
天命终不由人 2020-12-11 16:14

In C# PInvoke, how do I pass a string buffer so that the C DLL fills it and returns? What will be the PInvoke declaration?

The C function declaration is

<         


        
相关标签:
2条回答
  • 2020-12-11 17:03

    I believe it's correct.

    [DllImport(DllName)]
    static extern int GetData(StringBuilder data, int length);
    

    which is called like this:

    StringBuilder data = new StringBuilder(32);
    GetData(data, data.Capacity);
    

    I once wanted to have more control over the bytes returned by my function and did it like this:

    [DllImport(DllName)]
    private unsafe static bool GetData(byte* data, int length);
    

    used like this:

    byte[] bytes = new byte[length];
    
    fixed(byte* ptr = bytes)
    {
      bool success = Library.GetData(ptr, length);
    
      if (!success)
        Library.GetError();
    
      return Encoding.UTF8.GetString(bytes);
    }
    
    0 讨论(0)
  • 2020-12-11 17:04

    I don't think that using MarshalAs attribute necessary here. StringBuilder is a right choice for char* out.

    I guess it will be good to add the CharSet property since you are dealing with strings here.

    Like this:

    [DllImport(DllName, CharSet=CharSet.Auto)]
    
    0 讨论(0)
提交回复
热议问题