有沒有一種方法,即使是非常偷偷摸摸的方法來改變DateTime.UtcNow爲進程或線程返回的時間?如何更改進程或線程的DateTime.UtcNow的值?
SetSystemTime()
win32 API調用將改變整個系統的時間。我以前使用過這個,但是我想要一個對系統上運行的其他進程不太邪惡的方法。與時間混淆在自動構建服務器上是不好的。
C#似乎缺少覆蓋默認行爲所需的語言功能。
也許.Net用來獲取當前時間的方法可以用某種方式代理?
有沒有一種方法,即使是非常偷偷摸摸的方法來改變DateTime.UtcNow爲進程或線程返回的時間?如何更改進程或線程的DateTime.UtcNow的值?
SetSystemTime()
win32 API調用將改變整個系統的時間。我以前使用過這個,但是我想要一個對系統上運行的其他進程不太邪惡的方法。與時間混淆在自動構建服務器上是不好的。
C#似乎缺少覆蓋默認行爲所需的語言功能。
也許.Net用來獲取當前時間的方法可以用某種方式代理?
DateTime.UtcNow可能調用Kernel32!GetSystemTimeAsFileTime()或類似的東西。您可以使用Detour library from Microsoft Research來掛接此API,然後在您的掛鉤函數中檢測您想要隱藏的進程和線程ID。
祝您運行軟件!
我喜歡它!迂迴,拙劣,狡猾和強大。 – 2009-11-04 14:55:43
對於正確的記錄,它調用'GetSystemTimeAsFileTime()' 將需要一些工作來構建Detoure並將其包裝在C#API中,但它應該可以工作。 – 2009-11-04 20:47:44
你應該將當前時間包裝在你自己的代理類中,然後用它代替,然後你可以自由地返回你喜歡的任何東西。
我想到了這一點,但在進程空間中運行的其他庫會報告不一致的時間。 C#不允許擴展現有的方法或靜態方法,所以我不能簡單地覆蓋它。 真正爲所有代碼,我的和其他人編寫代碼的唯一方法是在操作系統級別執行此操作。 – 2009-11-04 14:41:34
是的,定義接口IKnowCurrentTime與單個屬性UtcNow。使用依賴注入將其注入到類中。使默認實現調用DateTime.UtcNow並將其傳遞給PROD中的類。出於測試目的,請對IKnowCurrentTime進行模擬,並讓它返回任何內容。未來寶寶的方式。
這是用於單元測試的目的嗎? – Simon 2009-11-03 07:01:21
是的。僅用於單元測試。 – 2009-11-04 14:56:22