我在某一个类中声明一个外部函数,是得到农历日期的
[DllImport("calendar.dll")]
public static extern int MyFormatLunarYear(int iYear, ref  string ptr);//以下在同一各类中的某个方法中调用
string ls_1 = "          ";
MyFormatLunarYear(iDate.Year, ref ls_1);
// 执行到以上一条时总是报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏
不知为何,望大虾们不吝赐教,谢谢!!!

解决方案 »

  1.   

    [DllImport("calendar.dll")] 
    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试图改变它,当然会报错。