当前位置:  开发笔记 > 编程语言 > 正文

C#中的元帅"char*"

如何解决《C#中的元帅"char*"》经验,为你挑选了2个好方法。

给定DLL中的以下C函数:

char * GetDir(char* path );

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



1> JaredPar..:

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

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

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

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



2> OregonGhost..:

尝试

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

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

您也可以尝试MarshalAs,如本例所示.


你知道为什么`串ANSI = Marshal.PtrToStringAnsi(PTR)的任何理由;`会成功,但返回用`字符集= CharSet.Ansi`一个`string`会失败?
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有