PInvoke:将文本从C转到C#时出错

PInvoke:将文本从C转到C#时出错,第1张

概述我使用Pinvoke实现Native(C)代码和Managed(C#)代码之间的互 *** 作性.我想要实现的是从本机代码中获取一些文本作为后续值,即我的C#代码调用我的C函数将一些文本返回给C#.以下是我的代码. C代码: static std::wstring WSTR_TEMP;wchar_t* cppReturnSomeText() { UnicodeString usText (" 我使用Pinvoke实现Native(C)代码和Managed(C#)代码之间的互 *** 作性.我想要实现的是从本机代码中获取一些文本作为后续值,即我的C#代码调用我的C函数将一些文本返回给C#.以下是我的代码.

C代码:

static std::wstring WSTR_TEMP;wchar_t* cppReturnSomeText() {     UnicodeString usText ("Some Text Here");     WSTR_TEMP = ECUtilsICU::UniCodeStringToWString(usText);     return  (wchar_t *)(WSTR_TEMP.c_str()); }

C#代码:

[Dllimport(MY_DLL_name][return: MarshalAs(UnmanagedType.LPWStr)]private static extern string cppReturnSomeText();public static string GetSomeText(){string s = cppReturnSomeText();return s;}

每件事都按预期工作正常.现在我只需将 *** 作系统从WinXP(32位)更改为Win7(64位).当我运行此代码后发生错误:

“试图读取或写入受保护的内存.这通常表明其他内存已损坏.”

解决方法 我想问题是你用C运行时的分配器分配内存,但C#marshaller试图解除分配它.那不行.您需要使用相同的分配器分配和取消分配.

我知道解决问题的最好方法是用BSTR编组.这使用了很快在本机模块和托管模块之间共享的COM分配器.

#include <comutil.h>BSTR cppReturnSomeText(){    UnicodeString usText("Some Text Here");    std::wstring result = ECUtilsICU::UniCodeStringToWString(usText);    return ::SysAllocString(result.c_str());}

在C#端你这样做:

[Dllimport(MY_DLL_name,CallingConvention=CallingConvention.Cdecl)][return: MarshalAs(UnmanagedType.BStr)]private static extern string cppReturnSomeText();

这样做的另一个好处是您的代码现在是线程安全的,因为您不再需要全局变量.

总结

以上是内存溢出为你收集整理的PInvoke:将文本从C转到C#时出错全部内容,希望文章能够帮你解决PInvoke:将文本从C转到C#时出错所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1229640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存