C#中的元帅“char *”

时间:2008-10-02 15:13:00

标签: .net pinvoke marshalling

在DLL中给出以下C函数:

char * GetDir(char* path );

你如何将这个函数调用到C#并正确编组char *。 .NET似乎知道如何做LPCTSTR但是当我无法弄清楚任何不会导致在调用此函数时触发NotSupportedException的编组。

2 个答案:

答案 0 :(得分:22)

只有从GetDir返回的char *在HGlobal或LocalAlloc中分配时,才能正确回答OregonGhost的答案。我不记得哪一个,但CLR会假设PInvoke函数中的任何字符串返回类型都被分配了一个或另一个。

更健壮的方法是将GetDir的返回值键入IntPtr。然后,您可以使用任何Marshal.PtrToStringAnsi函数来获取字符串类型。它还为您提供了以您选择的方式释放字符串的灵活性。


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

您能否就GetDir的行为给出任何其他提示?它会修改输入字符串吗?如何分配返回的值?如果你能提供,我可以给出更好的答案。

答案 1 :(得分:12)

尝试

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

字符串自动编组为以零结尾的字符串,并且使用CharSet属性,告诉Marshaller它应该使用ANSI而不是Unicode。 注意:对于char char *使用字符串(或System.String),对于char *使用StringBuilder。

您也可以尝试MarshalAs,如this example