3

我需要在我的 C# 代码中使用本机 dll (WNSMP32.dll) 中的以下函数。

SNMPAPI_STATUS SnmpStartupEx( _Out_  smiLPUINT32 nMajorVersion,...); 
//Considering just one for purpose of discussion

为此,我将 dllimport 声明为

[DllImport("wsnmp32.dll")]  internal static extern
Status SnmpStartupEx(out IntPtr majorVersion, ...); 
//Considering just one for purpose of discussion

我正在使用该功能

IntPtr majorVersion = Marshal.AllocHGlobal(sizeof(UINT32))

status = SnmpStartupEx(out majorVersion, out minVersion, 
                       out level, out translateMode, out retransmitMode )

分配内存后,我正在打印 IntPtr 的值。

<<<DEBUG OUTPUT>>> IntPtr Value = 112235522816

然而,在调用 之后,我发现 IntPtr 正在改变!

<<<DEBUG OUTPUT>>> IntPtr after calling SnmpStartupEx
<<<DEBUG OUTPUT>>> IntPtr Value = 111669149698
  1. 我应该在通话前通过 Marshal.AllocHGlobal 分配内存吗?
  2. 调用后更改 IntPtr 的地址是否有效?
4

1 回答 1

7

尝试:

[DllImport("wsnmp32.dll")]
internal static extern Status SnmpStartupEx(out UInt32 majorVersion,
                                            out UInt32 minorVersion, 
                                            out UInt32 level,
                                            out UInt32 translateMode,
                                            out UInt32 retransmitMode);

每个out参数实际上是一个指向函数覆盖的变量的指针。out IntPtr除非本机代码具有双指针,否则您不想编写。

你可以用AllocHGlobal一个普通的(按值传递,而不是outIntPtr参数自己做所有这些......但是当编译器可以为你做这件事时,为什么还要麻烦呢(编译器会更快,因为它会获取堆栈上局部变量的地址,而不是动态分配缓冲区空间然后复制)?

于 2012-12-06T18:17:00.317 回答