C#中的元帅" char *"
时间:2020-03-06 15:01:57 来源:igfitidea点击:
在DLL中提供以下C函数:
char * GetDir(char* path );
我们如何将此功能P /调用到Cand中以正确地编组char *。
.NET似乎知道如何执行LPCTSTR,但是当我无法找出调用该函数时不会引起NotSupportedException触发的任何封送处理时。
解决方案
尝试
[DllImport("your.dll", CharSet = CharSet.Ansi)] string GetDir(StringBuilder path);
字符串会自动编组为零结尾的字符串,并通过CharSet属性告诉编组,它应该使用ANSI而不是Unicode。
注意:将字符串(或者System.String)用于const char *,但将StringBuilder用于char *。
我们也可以尝试使用MarshalAs,如本例所示。
仅当从GetDir返回的char *在HGlobal或者LocalAlloc中分配时,OregonGhost的答案才是正确的。我不记得是哪一个,但是CLR会假定PInvoke函数的任何字符串返回类型都分配了一个。
一种更可靠的方法是将GetDir的返回值键入IntPtr。然后,我们可以使用任何Marshal.PtrToStringAnsi函数来获取字符串类型。它还为我们提供了以我们选择的方式释放字符串的灵活性。
[DllImport("your.dll", CharSet = CharSet.Ansi)] IntPtr GetDir(StringBuilder path);
我们能给我们有关GetDir行为的任何其他提示吗?它会修改输入字符串吗?返回值如何分配?如果可以的话,我可以给出更好的答案。