我在c中写了一个dll,我使用p / invoke
在c#中使用它以下是dll中两个函数的示例:
__declspec(dllexport) int init()
{
int *pointer=(int*)malloc(sizeof(int));
return *pointer;
}
__declspec(dllexport) void add(int item)
{
int *pointer=(int*)malloc(sizeof(int));
pointer=&item;
}
以下是c#中的dll导入定义:
[DllImport("c_code.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int init();
[DllImport("c_code.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void add(int item);
现在init
效果很好,但add
会抛出异常:
尝试读取或写入受保护的内存
这通常表明其他内存已损坏
我做错了吗?
我甚至删除了add函数的全部内容,它仍然这样做,我使用p / invoke有什么问题吗?我认为这是使用p \ invoke时的问题。
如果有问题,我也可以在x64 pc上运行
注意:函数中的内容并不重要,因为即使它们是空的,它仍然会出现我给出了这个应该有效的简单示例,但出于某种疯狂的原因它不会
答案 0 :(得分:1)
问题中的代码不会导致您报告的错误。问题出在程序中的其他位置,代码中没有问题。
其他代码很可能会破坏堆或堆栈,但在调用此处显示的函数之前,错误不会显现。
另一个似是而非的解释是问题中的代码与您运行的代码不同。这当然是可以想象的,尤其是因为问题中的代码无法编译。
虽然看了问题中的代码,但这是相当可疑的。 init
函数返回未初始化的int
。并且add
函数泄漏内存,并对立即离开范围的局部变量进行无意义的赋值。但是,这些都不会导致您报告的错误。