使用C#中的本机DLL参数

时间:2012-12-06 18:09:41

标签: c# dllimport

我需要在我的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的地址是否有效?

1 个答案:

答案 0 :(得分:5)

尝试:

[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参数自行完成所有这些操作...但为什么要在遇到麻烦时解决所有问题编译器可以为你做(并且编译器会更快,因为它将获取堆栈上的局部变量的地址,而不是动态分配缓冲区空间然后复制)?