为什么 c# 无法从非托管 dll 获取正确的参数值

  • 本文关键字:获取 dll 参数 c# c winapi
  • 更新时间 :
  • 英文 :


Win32程序如下:

#ifdef A_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
extern "C" DLL_API  void EC_GetGin(int* icard);
void EC_GetGin(int* icard)
{
icard = 1;
}

C# 代码如下:

[DllImport("test.dll", EntryPoint = "EC_GetGin", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void EC_GetGin(ref int icard);
int icard = 0;
EC_GetGin(ref icard);

为什么 C# 不能得到 1 ?

C 代码修改指针,而不是写入指针指向的变量。将其更改为

void EC_GetGin(int* icard)
{
*icard = 1;
}

如果将参数声明为out而不是ref,则 C# 代码会更干净。

在 C 代码中,您不会在内存位置中设置值,而是在icard中更改指针(您让icard指向内存位置1(。

更改要使用的内存位置icard点中的值

*icard = 1;

您需要修改值,将*与指针一起使用以获取值。

void EC_GetGin(int* icard)
{
*icard = 1;
}

最新更新