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通常の(値渡しではなくout)パラメーターを使用して、これらすべてを自分で行うことができIntPtrます...しかし、コンパイラーがそれを実行できるのに、なぜそのすべての問題に取り組むのですか(コンパイラーはより高速になります。バッファスペースを動的に割り当ててからコピーするのではなく、スタック上のローカル変数のアドレスを取得しますか?

于 2012-12-06T18:17:00.317 に答える