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