我在某一个类中声明一个外部函数,是得到农历日期的
[DllImport("calendar.dll")]
public static extern int MyFormatLunarYear(int iYear, ref string ptr);//以下在同一各类中的某个方法中调用
string ls_1 = " ";
MyFormatLunarYear(iDate.Year, ref ls_1);
// 执行到以上一条时总是报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏
不知为何,望大虾们不吝赐教,谢谢!!!
[DllImport("calendar.dll")]
public static extern int MyFormatLunarYear(int iYear, ref string ptr);//以下在同一各类中的某个方法中调用
string ls_1 = " ";
MyFormatLunarYear(iDate.Year, ref ls_1);
// 执行到以上一条时总是报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏
不知为何,望大虾们不吝赐教,谢谢!!!
public static extern int MyFormatLunarYear(int iYear, ref string ptr);
----------------------------------------------------------------------------------------
改为:
[DllImport("calendar.dll",CharSet=CharSet.Ansi)]
public static extern int MyFormatLunarYear(int iYear, StringBuilder ptr);
如果ptr是Unicode字符串,则CharSet=CharSet.Unicode。
调用时先给ptr分配空间:
StringBuilder ptr = new StringBuilder(256);
MyFormatLunarYear(iDate.Year, ptr); -------------------------------------------------------------------------
// 执行到以上一条时总是报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏
-------------------------------------------------------------------------
这是因为string在.net中是一旦创建就不能改变的。
string ls_1 = " ";
编译器会在受保护的内存中分配空间,而你在calendar.dll试图改变它,当然会报错。