我正在進行硬件測試。我們的測試框架是用C#編寫的,但我們使用本地dll與硬件進行通信。DllImport和返回參數
假設我們有一個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
調用並不實際執行一個命令,而只是將它添加到一個序列中。然後可以通過發送一個特殊命令ExecuteSequence
來執行該序列。在序列正在執行時,C++代碼通過將數據複製到nativeStatus
指針所指的內存中來更新nativeStatus
。隨着順序完成ExecuteSequence
方法返回。此時我確信所有數據(本例中的nativeStatus
)都已更新。我的managedStatus
也會正確更新嗎?我聽說在這種情況下,managedStatus
和nativeStatus
沒有指向相同的內存。在呼叫完成後,Marshaler僅返回nativeState
的副本。如果不是解決方案是什麼?我是否需要使用unsave關鍵字並將我的代碼創建並在fixed{}
塊中執行序列?
[DllImport(@"native.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
internal static unsave extern Byte someMethod(UInt32 * managedStatus)
你是說'someMethod'有可能kcik關閉後臺運行,而您希望它運行訪問狀態?或者'someMethod'永遠是一個阻塞的調用,在其工作過程中,在退出時設置一個狀態碼? – tcarvin