PInvoke的行为不合理

本文关键字:不合理 PInvoke | 更新日期: 2023-09-27 18:11:14

我用c写了一个dll,我在c#中使用p/invoke

下面是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抛出异常:

试图读写受保护的内存

这通常表明其他内存已损坏

我做错什么了吗?

我甚至删除了添加函数的整个内容,它仍然这样做,我使用p/invoke有什么问题吗?我想这是p'invoke的使用问题。

如果有问题,我也会在x64 pc上运行

注意:函数中的内容并不重要,因为即使它们是空的,它仍然会出现。我给出了这个简单的例子,应该可以工作,但由于一些疯狂的原因,它没有

PInvoke的行为不合理

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

很可能是其他代码破坏了堆或堆栈,但是直到调用这里显示的函数才会显示错误。

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

看看问题中的代码,它是相当可疑的。init函数返回一个未初始化的intadd函数泄漏内存,并对立即离开作用域的局部变量进行无意义的赋值。但是,这两种方法都不会导致您报告的错误。