如何防止.NET运行时中的静态变量共享?

时间:2008-09-17 15:00:40

标签: c# .net multithreading

我正在开发一个使用Robocode-like编程模型的游戏(C#):参与者继承基类并添加战略行为。然后游戏加载参与者类的实例并开始竞争。不幸的是,参与者可以通过在竞争对手Class的实例之间共享静态变量来“欺骗”。

如何防止.NET语言中的Class实例之间的静态变量共享?我知道这是通过每个实例使用一个单独的ClassLoader在Java中完成的。什么是.NET等价物?

此外,我的测试表明,单独的AppDomains仅在加载扩展MarshalByRefObject的类时才起作用。我想这是有道理的 - 如果您只是加载Serializable类,则将Class复制到当前的AppDomain中,以便来自不同AppDomain的第二个对象将共享其静态变量。 MarshalByRefObject保证只有一个代理被加载到当前的AppDomain中,并且静态数据会在加载AppDomain中留下。另见:http://blogs.msdn.com/ericlippert/archive/2004/05/27/143203.aspx

6 个答案:

答案 0 :(得分:8)

将每个竞争对手加载到不同的AppDomain中。

答案 1 :(得分:7)

静态变量是per-AppDomain,所以你可以考虑使用不同的AppDomain,但我完全不知道可能带来的其他后果。

否则,您可以事先使用反射检查类,并拒绝任何具有静态成员的类。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我没有具体的答案,但我会看看.NET Terrarium项目。所有参与者都是用户加载的DLL。他们做了很多巧妙的工作,以防止加载/执行不安全和骗子代码。

Justin Rogers关于Terrarium实施细节written extensively

答案 4 :(得分:0)

那是我正在研究的真正Robocode的.NET插件中的solution

答案 5 :(得分:0)

[ThreadStatic]属性会对你有用吗?只要你的玩家处于不同的线程中,它就可能成功。来自MSDN网站:

  

静态(在Visual Basic中共享)   标有的字段   ThreadStaticAttribute不共享   线程之间。每个执行线程   有一个单独的领域实例,   并独立设定和获取价值   对于那个领域。如果该字段是   它在不同的线程上访问   将包含不同的值。