+ -
当前位置:首页 → 问答吧 → 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

时间:2011-12-27

来源:互联网

使用C#调用C++写的DLL文件时出错
DLL中的函数(实现Unicode转换为Ansi的操作)为:
extern "C" __declspec(dllexport) char* UnicodeToAnsi()
{
wchar_t *wszString = L"abcd1234你我他";
int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
char *szAnsi = new char[ansiLen + 1];
::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);
szAnsi[ansiLen] = '\0';
return szAnsi;
}
C#调用的函数为:
string str = Cppdll.UnicodeToAnsi();---->就在这里出错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
C#类
 public class Cppdll
  {
  [DllImport("CharConvertDll.dll",CharSet = CharSet.Unicode)]
  public static extern string UnicodeToAnsi();
  }

作者: tcwushaofei   发布时间: 2011-12-27

怎么没人相应呀! 高手们哪里去了呀!!

作者: tcwushaofei   发布时间: 2011-12-28

兄弟,我也遇到类似的问题,我是C++菜鸟,C++到C#参数已转化我就晕了,有高手能帮忙吗。

哎,帮忙顶一下

顺便连接一下我的帖子:

http://topic.csdn.net/u/20111228/10/cde7eef9-3cc0-4709-a399-11717058fc6c.html?61084

作者: jian200801   发布时间: 2011-12-28

UnicodeToAnsi
相当于:
C# code

string str = L"abcd1234你我他";
byte[] bytes = Encoding.Default.GetBytes(str);

作者: gomoku   发布时间: 2011-12-28

把字符集改改:
C# code

  [DllImport("CharConvertDll.dll",CharSet = CharSet.Ansi)]
  public static extern string UnicodeToAnsi();

作者: sdl2005lyx   发布时间: 2011-12-28