使用C#中的本机DLL参数

son*_*phi 2 c# dllimport

我需要在我的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)
  1. 我应该在通话前通过Marshal.AllocHGlobal分配内存吗?
  2. 调用后IntPtr的地址是否有效?

Ben*_*igt 5

尝试:

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