【发布时间】:2019-08-21 22:19:18
【问题描述】:
我试图弄清楚为什么我需要使 DLLImport 函数的参数为“ref int XXX”,而不仅仅是“int XXX”。对于后者,这会导致“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”问题......但是当我在参数中添加“ref”时......它工作得很好。例如:
[DllImport("someDLL.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SomeDLL_GetDevices(ref int devices);
^以上作品
[DllImport("someDLL.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SomeDLL_GetDevices(int devices);
^ 上述崩溃和烧毁
我不是来自 C# 的 C++ 调用及其编组方面的导出,所以如果有人能解释为什么一个有效而一个无效,我将不胜感激。
【问题讨论】:
-
C/C++ 中的函数签名是什么? general 中不需要
ref关键字,但您尝试调用的特定函数需要它。 -
我猜本机函数需要一个 int 指针,而不是一个 int。如果您将
devices的值作为 int 传递,则解释为指针的值不太可能恰好指向内存中的有效位置。 -
DWORD SomeDLL_GetDevices (WORD *devices)
-
我猜如果它只是一个 WORD 它将是 int,但 WORD * 是 int 指针,它是 ref int。 Tbh 我错过了 *... 没看到...
标签: c#