2009-11-02 45 views
0

有沒有一種方法,即使是非常偷偷摸摸的方法來改變DateTime.UtcNow爲進程或線程返回的時間?如何更改進程或線程的DateTime.UtcNow的值?

SetSystemTime() win32 API調用將改變整個系統的時間。我以前使用過這個,但是我想要一個對系統上運行的其他進程不太邪惡的方法。與時間混淆在自動構建服務器上是不好的。

C#似乎缺少覆蓋默認行爲所需的語言功能。

也許.Net用來獲取當前時間的方法可以用某種方式代理?

+0

這是用於單元測試的目的嗎? – Simon 2009-11-03 07:01:21

+0

是的。僅用於單元測試。 – 2009-11-04 14:56:22

回答

3

DateTime.UtcNow可能調用Kernel32!GetSystemTimeAsFileTime()或類似的東西。您可以使用Detour library from Microsoft Research來掛接此API,然後在您的掛鉤函數中檢測您想要隱藏的進程和線程ID。

祝您運行軟件!

+0

我喜歡它!迂迴,拙劣,狡猾和強大。 – 2009-11-04 14:55:43

+0

對於正確的記錄,它調用'GetSystemTimeAsFileTime()' 將需要一些工作來構建Detoure並將其包裝在C#API中,但它應該可以工作。 – 2009-11-04 20:47:44

4

你應該將當前時間包裝在你自己的代理類中,然後用它代替,然後你可以自由地返回你喜歡的任何東西。

+0

我想到了這一點,但在進程空間中運行的其他庫會報告不一致的時間。 C#不允許擴展現有的方法或靜態方法,所以我不能簡單地覆蓋它。 真正爲所有代碼,我的和其他人編寫代碼的唯一方法是在操作系統級別執行此操作。 – 2009-11-04 14:41:34

0

是的,定義接口IKnowCurrentTime與單個屬性UtcNow。使用依賴注入將其注入到類中。使默認實現調用DateTime.UtcNow並將其傳遞給PROD中的類。出於測試目的,請對IKnowCurrentTime進行模擬,並讓它返回任何內容。未來寶寶的方式。