加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – MarshalAs(UnmanagedType.LPWStr)和Marshal.PtrToStringUn

发布时间:2020-12-16 01:54:06 所属栏目:百科 来源:网络整理
导读:我想导入这样的函数: [return: MarshalAs(UnmanagedType.LPWStr)][DllImport("DLL.dll",EntryPoint="FuncUtf16",ExactSpelling=true,PreserveSig=true,CharSet=CharSet.Unicode)]public static extern string Func(); 但这给了我一个这样的错误: “Windows
我想导入这样的函数:

[return: MarshalAs(UnmanagedType.LPWStr)]
[DllImport("DLL.dll",EntryPoint="FuncUtf16",ExactSpelling=true,PreserveSig=true,CharSet=CharSet.Unicode)]
public static extern string Func();

但这给了我一个这样的错误:

“Windows在Test.exe中触发了断点.这可能是由于堆的损坏,这表明Test.exe或其加载的任何DLL中存在错误.”

当我反复按“继续”时,该功能确实给出了预期的输出.但是,当我有机会上述声明时:

[DllImport("DLL.dll",CharSet=CharSet.Unicode)]
public static extern IntPtr Func();

(将返回类型更改为IntPtr)并按如下方式调用它:

Dim a As IntPtr = Func()
Dim Str As String = Runtime.InteropServices.Marshal.PtrToStringUni(a)

,我没有错误,它工作得很好!使用“MarshalAs”方式在dll中声明一个函数有什么问题?

解决方法

为返回char * / wchar_t *的方法编写PInvoke签名需要非常小心,因为CLR特殊情况字符串返回类型.它做出以下假设

>转换为字符串后,必须释放char *的内存
>内存分配了CoTaskMemAlloc

如果其中任何一个不正确(通常是这种情况),那么程序将遇到错误.

一般来说,最好只返回一个IntPtr并手动编组字符串,就像你使用PtrToStringUni一样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读