我需要在我的C#代码中使用本机dll(WNSMP32.dll)中的以下函数.
SNMPAPI_STATUS SnmpStartupEx( _Out_ smiLPUINT32 nMajorVersion,...);
//Considering just one for purpose of discussion
Run Code Online (Sandbox Code Playgroud)
为此,我将dllimport声明作为
[DllImport("wsnmp32.dll")] internal static extern
Status SnmpStartupEx(out IntPtr majorVersion, ...);
//Considering just one for purpose of discussion
Run Code Online (Sandbox Code Playgroud)
我正在使用该功能
IntPtr majorVersion = Marshal.AllocHGlobal(sizeof(UINT32))
status = SnmpStartupEx(out majorVersion, out minVersion,
out level, out translateMode, out retransmitMode )
Run Code Online (Sandbox Code Playgroud)
在分配内存后,我正在打印IntPtr的值.
<<<DEBUG OUTPUT>>> IntPtr Value = 112235522816
Run Code Online (Sandbox Code Playgroud)
但是在调用之后,我发现IntPtr正在改变!
<<<DEBUG OUTPUT>>> IntPtr after calling SnmpStartupEx
<<<DEBUG OUTPUT>>> IntPtr Value = 111669149698
Run Code Online (Sandbox Code Playgroud)
尝试:
[DllImport("wsnmp32.dll")]
internal static extern Status SnmpStartupEx(out UInt32 majorVersion,
out UInt32 minorVersion,
out UInt32 level,
out UInt32 translateMode,
out UInt32 retransmitMode);
Run Code Online (Sandbox Code Playgroud)
每个out参数实际上都是指向函数覆盖的变量的指针.out IntPtr除非本机代码具有双指针,否则您不想写.
您可以自己完成所有这些AllocHGlobal并且正常(按值传递,而不是out)IntPtr参数...但是为什么在编译器可以为您完成时会遇到所有麻烦(编译器会更快,因为它会获取堆栈上的局部变量的地址,而不是动态分配缓冲区空间,然后复制)?
| 归档时间: |
|
| 查看次数: |
5814 次 |
| 最近记录: |