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#时出错所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)