日期:2014-05-17  浏览次数:20874 次

c#调用c++的dll,报出:尝试读取或写入受保护的内存。这通常指示其他内存已损坏
c#调用c++的dll,报出:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
  这个在C里面调用的方式是这样的:
   int convertFun(wchar_t* docPath, wchar_t* Names, wchar_t* userName, int doc_level,CString operation=L"1")

   我在C#里面定义如下:
        [DllImport("ConvertLib.dll")]
        static extern int convertFun(string docPath, string Names, string userName, int doc_level, string operation);

  调用的代码:
    convertFun("C:\\temp\\test.doc", "test", "guest",1, "1");
   就发生“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”这个错误。
请各位帮忙看看?


c++ c# dll

------解决方案--------------------
MFC的CString在CLR中找不到等价的封送类型。你需要用C++.NET编写一个代理程序去调用,如果dll部分你无法修改的话。
------解决方案--------------------
wchar_t*是unicode字符串,你要在c#指明字符编码类型,CString 这个参数很奇怪,按理在dll中不应该传送这种参数,而且还缺省是unicode,
------解决方案--------------------
string一般用 stringBuilder

int 这些值类型,一般来说可以直接用,但是有时候要加ref

加试试ref 试试看行不行,也是以前遇到问题的经验,这个不是一定的
------解决方案--------------------
首先确定dll本身没问题,用C/C++同样的数据先调用证实;
其次最后一个参数不是有默认值么,我看你传的也就是默认值。
------解决方案--------------------
wchart*改用string[]试试看.
cstring应该直接传string就行了.
C#默认就是unicode
------解决方案--------------------
应该是CString参数的问题吧,其他的参数应该都对的!