PInvoke表现得非理性

时间:2014-07-02 17:50:41

标签: c# pinvoke

我在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上运行

注意:函数中的内容并不重要,因为即使它们是空的,它仍然会出现我给出了这个应该有效的简单示例,但出于某种疯狂的原因它不会

1 个答案:

答案 0 :(得分:1)

问题中的代码不会导致您报告的错误。问题出在程序中的其他位置,代码中没有问题。

其他代码很可能会破坏堆或堆栈,但在调用此处显示的函数之前,错误不会显现。

另一个似是而非的解释是问题中的代码与您运行的代码不同。这当然是可以想象的,尤其是因为问题中的代码无法编译。

虽然看了问题中的代码,但这是相当可疑的。 init函数返回未初始化的int。并且add函数泄漏内存,并对立即离开范围的局部变量进行无意义的赋值。但是,这些都不会导致您报告的错误。