谁能提供一些见解?
解决方法
简短的回答是,你很幸运,因为CLR应该妥善处理你的事情.
较长的答案涉及COM互操作代码的不同类型的编组,具体取决于参数类型,方向以及您添加到互操作签名的属性.
在这种情况下,您将在调用中获得的参数类型是“out string”参数,具有MarshalAs(UnmanagedType.LPWSTR)属性.当COM服务器公开具有LPWSTR字符串类型的“out”参数的调用时,假设服务器保持其交易结束,它将使用CoTaskMemAlloc()分配内存缓冲区并将其返回给您. (如果它是一个不同的字符串类型,如BSTR,特定的内存分配调用可能不同,但基本概念是相同的.)此时,您负责在不再需要时清理该内存,使用匹配的CoTaskMemFree()调用.
这是一种称为“引用更改”的特殊操作类型:您发送的参数已经是引用参数,但COM服务器将使用不同的引用替换它.有关此过程的一个很好的解释可以在this MSDN magazine article的“内存所有权”部分找到.正如您从该文章中看到的那样,当CLR从引用类型的“out”参数接收数据时,它会认识到它正在承担责任释放那个记忆.在编组回调托管代码时,它使用MarshalAs属性来确定这是COM中的LPWSTR字符串类型指针,因此它应该使用CoTaskMemAlloc()进行分配.在从数据中创建托管字符串后,它将代表您在原始缓冲区上调用CoTaskMemFree().您获得的数据将得到全面管理,您无需处理任何所有权问题.
原文地址:https://www.jb51.cc/csharp/100031.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。