簡體   English   中英

如何防止 .NET 運行時中的靜態變量共享?

[英]How do I prevent static variable sharing in the .NET runtime?

我正在開發一個使用類似於 Robocode 的編程模型的游戲 (C#):參與者繼承基類並添加策略行為。 然后游戲加載參與者的課程實例,比賽開始。 不幸的是,參與者可以通過在他們的競爭對手 Class 的實例之間共享靜態變量來“欺騙”。

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

此外,我的測試表明,單獨的 AppDomains 僅在加載擴展 MarshalByRefObject 的類時才有效。 我想這是有道理的 - 如果您只是加載一個可序列化的類,該類會被復制到當前的 AppDomain 中,因此來自不同 AppDomain 的第二個對象將共享其靜態變量。 MarshalByRefObject 保證僅將代理加載到當前 AppDomain 中,而靜態數據則留在加載的 AppDomain 中。 另見: http : //blogs.msdn.com/ericlippert/archive/2004/05/27/143203.aspx

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

靜態變量是針對每個 AppDomain 的,因此您可以考慮使用不同的 AppDomain,但我完全不知道可能會產生什么其他后果。

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

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

這是我正在研究的真實 Robocode 的 .NET 插件中的解決方案

[ThreadStatic] 屬性對您有用嗎? 只要您的玩家處於不同的線程中,它就可能會奏效。 從 MSDN 站點:

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

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

賈斯汀·羅傑斯 (Justin Rogers) 撰寫了大量關於 Terrarium 實現細節的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM