Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 平沃克的行为不合理_C#_Pinvoke - Fatal编程技术网

C# 平沃克的行为不合理

C# 平沃克的行为不合理,c#,pinvoke,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*)mal

我用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导入的定义:

现在
init
工作正常,但
add
引发异常:

试图读取或写入受保护的内存

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

我做错什么了吗

我甚至删除了add函数的全部内容,但它仍然这样做,我使用p/invoke时有什么错误吗?我认为这是使用p\invoke时的一个问题

如果有问题,我也会在x64电脑上运行它


注意:函数中的内容并不重要,因为即使它们是空的,它也会发生。我给出了一个简单的例子,这个例子应该可以工作,但由于一些疯狂的原因,它不起作用。问题中的代码不会导致您报告的错误。问题存在于程序的其他地方,在问题中不存在的代码中

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

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


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

我觉得这很难相信。也就是说,你的两个函数都是毫无意义的。我知道这很疯狂,我没有给出我的全部代码,这可能太长了,但这仍然是函数的签名,如果我将它们更改为我在这里写的,我仍然会遇到同样的问题。如果错误发生在一个空的add中,为什么要将代码放在这里包含的代码中?你确定这是真正的代码吗?这不是真正的代码,但没关系,我甚至编辑了函数,使其与问题类似,即使add为空,我仍然会得到相同的错误。Q中的代码不会给出你描述的错误。首先,问题中的代码应该编译,第二,即使这两个函数都是空的,我也强调不了这一点,我的意思是:int add(int item){}它仍然不工作,让我告诉你,是的,代码应该编译,但它没有。如果你试图编译它,你就会知道这一点。它是
dllimport
而不是
dllimport
。而且,当函数为空时,或者当您拥有它们时,它们不会导致错误。这很容易让你自己看到。创建全新的项目,并将Q中的代码添加到其中,然后修复它,使其能够编译。我在Q中拼写错误,它确实可以编译,当它们为空时,它们确实会导致错误。我发誓,我会尽力而为,但你错了。通过创建一个全新的项目并将这些功能添加到项目中,您可以自己发现。完成后请回来报告你的发现。请注意,我已经这样做了。我已经知道会发生什么。两个签名完全匹配p/invoke且具有正确调用约定的空函数不会导致该错误。当然他们没有。您需要从全新的DLL类型的空Win32项目开始。然后在Q中添加代码,然后从一个全新的C#项目调用它。就像我一样。试着感激我以前做过p/invoke:也许如果你看到了,那么你可能会感激我告诉你的
[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);