ハードウェアのテストに取り組んでいます。私たちのテスト フレームワークは C# で書かれていますが、ネイティブ DLL を使用してハードウェアと通信しています。
C++ メソッドがあるとします。
unsigned char someMethod(unsigned long * nativeStatus)
次に、埋め込みコマンドを実行し、コマンドが完了するとステータスを返します。
それを使用するには、ラッパーを作成します
[DllImport(@"native.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
internal static extern Byte someMethod(ref UInt32 managedStatus)
これはうまくいきます。someMethod
ただし、 call が実際にはコマンドを実行せず、シーケンスに追加するだけのシナリオがあります。次に、特別なコマンド say を送信することで、シーケンスを実行できますExecuteSequence
。シーケンスが実行されると、ポインタnativeStatus
が参照するメモリにデータをコピーするだけで C++ コードが更新されます。nativeStatus
シーケンスが完了すると、ExecuteSequence
メソッドが戻ります。nativeStatus
この時点で、すべてのデータ (この場合) が更新されていると確信しています。私のmanagedStatus
も正しく更新されますか?managedStatus
この場合、nativeStatus
同じメモリを指していないと聞きました。nativeState
マーシャラーは、呼び出しが完了した後にのコピーを返すだけです。そうでない場合、解決策は何ですか?unsave キーワードを使用して、シーケンスを作成および実行するコードをfixed{}
ブロック?
[DllImport(@"native.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
internal static unsave extern Byte someMethod(UInt32 * managedStatus)