鉴于一个DLL下面的C函数:
char * GetDir(char* path );
你会如何的P / Invoke此功能为C#和元帅的char *正常。 .NET似乎知道该怎么办LPCTSTR,但是当我想不通调用此函数时不会导致NotSupportedException异常火任何编组。
鉴于一个DLL下面的C函数:
char * GetDir(char* path );
你会如何的P / Invoke此功能为C#和元帅的char *正常。 .NET似乎知道该怎么办LPCTSTR,但是当我想不通调用此函数时不会导致NotSupportedException异常火任何编组。
如果字符*从GETDIR返回要么在HGLOBAL或LocalAlloc分配OregonGhost的答案是唯一正确的。 我不记得是哪一个,但CLR会假定从PInvoke的函数的任何字符串返回类型与一个或另一个分配。
一个更可靠的方法是键入GETDIR的回报是IntPtr的。 然后,你可以为了得到一个字符串类型使用任何Marshal.PtrToStringAnsi功能。 它也给你在你所选择的方式释放字符串的第灵活性。
[DllImport("your.dll", CharSet = CharSet.Ansi)]
IntPtr GetDir(StringBuilder path);
您能不能给我们任何其他线索来GETDIR的行为? 是否修改输入字符串? 其返回值是如何分配的? 如果您可以提供,我可以给一个更好的答案。
尝试
[DllImport("your.dll", CharSet = CharSet.Ansi)]
string GetDir(StringBuilder path);
字符串被自动编组到0结尾的字符串,并与CharSet属性,你告诉的Marshaller,它应该使用ANSI而不是Unicode格式。 注意:使用字符串(或System.String)为一个const char *,但对于StringBuilder的一个char *。
您也可以尝试的MarshalAs,在这个例子中 。