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

0o流沙o0 2012-12-16 10:09:03
这是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程序中调用时,刚开始第一次点击可以成功,后来多运行几次,或多点几次就会出现:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏” 这样的异常。 有没哪位高手知道的 告诉一下我,,,,在这里谢谢了!!
...全文
158 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
0o流沙o0 2012-12-17
  • 打赏
  • 举报
回复
引用 2 楼 avphoenixi 的回复:
AddProClass 这个函数的申明呢,另外 AddProduct 函数是干什么的
额 写错了 Product的声明为

[DllImport("linklist.dll", CharSet = CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]       
 private extern static void AddProClass(ProClass proclass);

__天涯寻梦 2012-12-17
  • 打赏
  • 举报
回复
AddProClass 这个函数的申明呢,另外 AddProduct 函数是干什么的
只在此山中 2012-12-17
  • 打赏
  • 举报
回复
整个struct都用IntPtr传非托管内存数据过去,大小自己根据内容定义。
0o流沙o0 2012-12-17
  • 打赏
  • 举报
回复
哈哈,,,,终于解决了 我在google上找到的一个方法,给大家分享一下。 http://stackoverflow.com/questions/3469368/how-to-handle-accessviolationexception 先谢谢楼上两位热心的朋友了 大家以后多交流啊
0o流沙o0 2012-12-17
  • 打赏
  • 举报
回复
引用 1 楼 zdbb 的回复:
整个struct都用IntPtr传非托管内存数据过去,大小自己根据内容定义。
还是不行啊 依然提示那个异常 这是改变后的代码 c的


void AddProClass(ProClass* proclass)
{
	FILE* fp;
	fp=fopen("ProClass.txt","ab");
	fprintf(fp,"%s %s",proclass->ProClassName,proclass->ProClassRegDate);
	fclose(fp);
}
C#的

[DllImport("linklist.dll", CharSet = CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]        private extern static void AddProClass([In,Out]ref IntPtr proclass);

public static void AddProClass(string ProClassName)
        {
            
                ProClass proclass = new ProClass();
                proclass.ProClassName = ProClassName;
                proclass.ProClassRegDate = GetTime();
                proclass.next = IntPtr.Zero;
                IntPtr ip = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ProClass)));
                Marshal.StructureToPtr(list, ip, true);
                AddProClass(ref ip);
        }

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧