Marshal “char *” in C#

后端 未结 2 1374
耶瑟儿~
耶瑟儿~ 2020-11-27 19:47

Given the following C function in a DLL:

char * GetDir(char* path );

How would you P/Invoke this function into C# and marshal the char * pr

相关标签:
2条回答
  • 2020-11-27 19:59

    OregonGhost's answer is only correct if the char* returned from GetDir is either allocated in HGlobal or LocalAlloc. I can't remember which one but the CLR will assume that any string return type from a PInvoke function was allocated with one or the other.

    A more robust way is to type the return of GetDir to be IntPtr. Then you can use any of the Marshal.PtrToStringAnsi functions in order to get out a string type. It also gives you th flexibility of freeing the string in the manner of your choosing.

    
    [DllImport("your.dll", CharSet = CharSet.Ansi)]
    IntPtr GetDir(StringBuilder path);
    

    Can you give us any other hints as to the behavior of GetDir? Does it modify the input string? How is the value which is returned allocated? If you can provide that I can give a much better answer.

    0 讨论(0)
  • 2020-11-27 20:09

    Try

    [DllImport("your.dll", CharSet = CharSet.Ansi)]
    string GetDir(StringBuilder path);
    

    string is automatically marshalled to a zero-terminated string, and with the CharSet property, you tell the Marshaller that it should use ANSI rather than Unicode. Note: Use string (or System.String) for a const char*, but StringBuilder for a char*.

    You can also try MarshalAs, as in this example.

    0 讨论(0)
提交回复
热议问题