2008-09-17 71 views
1

我正在開發一個使用Robocode-like編程模型的遊戲(C#):參與者繼承基類並添加策略行爲。遊戲然後加載參與者的課程實例,並開始比賽。不幸的是,參與者可以通過在他們競爭對手的實例之間共享靜態變量來「作弊」。如何防止.NET運行時中的靜態變量共享?

如何防止.NET語言中Class實例之間的靜態變量共享?我知道這是通過每個實例使用單獨的ClassLoader在Java中完成的。什麼是.NET等價物?

在此先感謝...

注意的解決方案:我的測試表明,單獨的AppDomain只加載擴展MarshalByRefObject的類時工作。我猜這是有道理的 - 如果你只是加載一個Serializable類,那麼Class就會被複制到當前的AppDomain中,所以來自另一個AppDomain的第二個對象將共享它的靜態變量。 MarshalByRefObject保證只有一個代理被加載到當前AppDomain中,並且靜態在加載AppDomain中保留。另請參閱:http://blogs.msdn.com/ericlippert/archive/2004/05/27/143203.aspx

回答

8

將每個競爭對手加載到不同的AppDomain中。

+0

不會阻止競爭對手互動(即競爭)嗎? – 2008-09-17 15:50:12

7

靜態變量是每AppDomain,所以你可以看看使用不同的AppDomain,但我完全不知道可能會有什麼其他後果。

否則,您可以事先使用反射來檢查類,並拒絕任何具有靜態成員的類。

0

我沒有具體的答案,但我會看看.NET Terrarium項目。所有參與者都是用戶加載的DLL。他們做了很多整潔的事情來防止加載/執行不安全和欺騙代碼。

賈斯汀羅傑斯written extensively關於Terrarium實施細節。

2
if(typeof(CompetitorClass).GetFields(BindingFlags.Static)) 
{ 
// take necessary steps against cheater! 
} 
0

這就是solution在.NET插件的真實Robocode我正在努力。

0

[ThreadStatic]屬性會爲你工作嗎?只要你的球員在不同的線程中,它可能會有訣竅。從MSDN站點:

靜態 字段(Visual Basic中的Shared)標有 ThreadStaticAttribute沒有線程之間共享 。每個正在執行的線程 都有一個單獨的字段實例, 並獨立設置並獲取該字段的值 。如果該字段是在另一個線程上訪問的 ,則其 將包含不同的值。