元帅“的char *”,在C#(Marshal “char *” in C#)

2019-09-01 10:16发布

鉴于一个DLL下面的C函数:

char * GetDir(char* path );

你会如何的P / Invoke此功能为C#和元帅的char *正常。 .NET似乎知道该怎么办LPCTSTR,但是当我想不通调用此函数时不会导致NotSupportedException异常火任何编组。

Answer 1:

如果字符*从GETDIR返回要么在HGLOBAL或LocalAlloc分配OregonGhost的答案是唯一正确的。 我不记得是哪一个,但CLR会假定从PInvoke的函数的任何字符串返回类型与一个或另一个分配。

一个更可靠的方法是键入GETDIR的回报是IntPtr的。 然后,你可以为了得到一个字符串类型使用任何Marshal.PtrToStringAnsi功能。 它也给你在你所选择的方式释放字符串的第灵活性。


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

您能不能给我们任何其他线索来GETDIR的行为? 是否修改输入字符串? 其返回值是如何分配的? 如果您可以提供,我可以给一个更好的答案。



Answer 2:

尝试

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

字符串被自动编组到0结尾的字符串,并与CharSet属性,你告诉的Marshaller,它应该使用ANSI而不是Unicode格式。 注意:使用字符串(或System.String)为一个const char *,但对于StringBuilder的一个char *。

您也可以尝试的MarshalAs,在这个例子中 。



文章来源: Marshal “char *” in C#