0

ハードウェアのテストに取り組んでいます。私たちのテスト フレームワークは 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)
4

1 に答える 1

0

したがって、必要なのは、時間の経過とともに変化しない変数の場所です。

はい、そのために使用できますfixed{}
または、その変数を固定できます。

private uint g_Pinnable = 0;

...

var gc = System.Runtime.InteropServices.GCHandle.Alloc(g_Pinnable, System.Runtime.InteropServices.GCHandleType.Pinned);

try
{
    // Pass 'ref g_Pinnable' to API
    // Then execute the sequence.
}
finally
{
    gc.Free(); // Reference to g_Pinnable may be invalid after this point
}
于 2012-11-01T19:39:21.290 に答える