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

C#调用dll中的一个c写的访问文件的函数,出现Accessviolationexception异常
这是c代码

typedef struct ProClass
{
char* ProClassName;//产品类型
char* ProClassRegDate;//产品类型添加时间
ProClass* next;
}ProClass,*ProClassLink;

//添加产品类
void AddProClass(ProClass proclass)
{
FILE* fp;
fp=fopen("ProClass.txt","ab");
fprintf(fp,"%s %s",proclass.ProClassName,proclass.ProClassRegDate);
fclose(fp);
}





这是c#代码


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct ProClass
        {
            [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]
            public string ProClassName;
            [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]
            public string ProClassRegDate;
            public System.IntPtr next;
        }

[DllImport("linklist.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private extern static void AddProduct(LinkList product);


public static void AddProClass(string ProClassName)
        {
          
                ProClass proclass = new ProClass();
                proclass.ProClassName = ProClassName;
                proclass.ProClassRegDate = GetTime();
                proclass.next = IntPtr.Zero;
                AddProClass(proclass);
           
        }


在winform程序中调用时,刚开始第一次点击可以成功,后来多运行几次,或多点几次就会出现:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”  这样的异常。   有没哪位高手知道的  告诉一下我,,,,在这里谢谢了!!
------解决方案--------------------
整个struct都用IntPtr传非托管内存数据过去,大小自己根据内容定义。
------解决方案--------------------
AddProClass 这个函数的申明呢,另外 AddProduct 函数是干什么的