在C#中元帅“char *”

给定DLL中的以下C函数:

char * GetDir(char* path ); 

你将如何P /调用这个函数到C#中,并正确编组char *。 .NET似乎知道如何做LPCTSTR,但是当我不能找出任何调用此函数时不会导致NotSupportedExceptionexception的封送处理。

如果从GetDir返回的char *被分配在HGlobal或LocalAlloc中,OregonGhost的答案是正确的。 我不记得哪一个,但是CLR会认为来自PInvoke函数的任何string返回types都被分配了一个或另一个。

更健壮的方法是inputGetDir的返回值为IntPtr。 然后,您可以使用任何Marshal.PtrToStringAnsi函数来获取stringtypes。 它也为您提供了以您select的方式释放string的灵活性。

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

你能给我们任何其他提示GetDir的行为? 它修改inputstring吗? 如何分配返回的值? 如果你能提供,我可以给出更好的答案。

尝试

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

string会自动编组为零终止的string,并使用CharSet属性告诉Marshaller它应该使用ANSI而不是Unicode。 注意:使用string(或System.String)作为const char *,但使用StringBuilder作为char *。

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