关于c#:如何防止.NET运行时中的静态变量共享?

关于c#:如何防止.NET运行时中的静态变量共享?

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

我正在开发一个使用类似Robocode的编程模型的游戏(C#):参与者继承基类并添加策略性行为。然后,游戏会加载参与者的班级实例,比赛开始。不幸的是,参与者可以通过在竞争对手类的实例之间共享静态变量来"作弊"。

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

此外,我的测试表明,只有在加载扩展了MarshalByRefObject的Class时,单独的AppDomain才起作用。我想这是有道理的-如果仅加载可序列化的类,则将该类复制到当前的AppDomain中,因此来自另一个AppDomain的第二个对象将共享其静态变量。 MarshalByRefObject保证仅将代理加载到当前AppDomain中,并且静态变量保留在加载的AppDomain中。另请参阅:http://blogs.msdn.com/ericlippert/archive/2004/05/27/143203.aspx


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


静态变量是针对每个AppDomain的,因此您可以考虑使用不同的AppDomain,但是我完全不知道还有什么其他后果。

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


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

[ThreadStatic]属性对您有用吗? 只要您的玩家处于不同的线程中,它就可以解决问题。 从MSDN站点:

A static (Shared in Visual Basic)
field marked with
ThreadStaticAttribute is not shared
between threads. Each executing thread
has a separate instance of the field,
and independently sets and gets values
for that field. If the field is
accessed on a different thread, it
will contain a different value.


那是我正在开发的真正Robocode的.NET插件中的解决方案。


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

贾斯汀·罗杰斯(Justin Rogers)撰写了大量有关Terrarium实现细节的文章。


推荐阅读

    linux运行图形界命令?

    linux运行图形界命令?,系统,密码,地址,电脑,图形界面,地方,工具,界面,终端,

    linux怎样运行命令?

    linux怎样运行命令?,系统,工作,信息,基础,地址,命令,目录,工具,密码,一致,Lin

    linux编译完运行命令?

    linux编译完运行命令?,系统,代码,环境,工具,信息,命令,文件,程序,终端,编辑,

    linux命令程序运行?

    linux命令程序运行?,状态,系统,服务,情况,命令,进程,软件,数据,发行,时间,Lin

    linux运行脚本命令?

    linux运行脚本命令?,系统,代码,服务,文件,工具,平台,网站,脚本,命令,方法,Lin

    linux命令后加运行?

    linux命令后加运行?,状态,暂停,工具,单位,进程,环境,网络,系统,权威,第一,mv

    ssh运行linux命令?

    ssh运行linux命令?,地址,服务,系统,软件,工具,电脑,网络,密码,名称,命令,在li

    linux运行多个命令?

    linux运行多个命令?,环境,软件,系统,工作,服务,连续,命令,指令,分号,冲突,lin

    linux运行命令查看?

    linux运行命令查看?,系统,信息,状态,命令,名称,情况,地址,软件,进程,第一,lin

    linux中命令运行软件?

    linux中命令运行软件?,软件,系统,名称,工具,电脑,位置,环境,中心,在线,初级,

    脚本linux上运行命令?

    脚本linux上运行命令?,工具,代码,时间,密码,系统,环境,名字,位置,第三,下来,t

    linux运行命令的脚本?

    linux运行命令的脚本?,系统,服务,工具,脚本,意外,技术,分析,文件,方法,命令,s

    linux影藏运行命令?

    linux影藏运行命令?,档案,电脑,标准,设备,代码,工具,系统,查询系统,暂停,命

    linux运行脚本的命令?

    linux运行脚本的命令?,系统,工具,代码,服务,脚本,状态,密码,环境,位置,暂停,l

    linux命令行运行中断?

    linux命令行运行中断?,连续,工作,系统,信息,程序,命令,设备,工具,网络,情况,L

    vim运行linux命令?

    vim运行linux命令?,系统,工作,信息,地址,命令,标准,时间,情况,工具,基础,linu

    linux下并行运行命令?

    linux下并行运行命令?,系统,服务,工作,命令,环境,网络,暂停,文件,脚本,参数,l

    jar运行命令linux?

    jar运行命令linux?,项目,系统,平台,工具,上期,命令,选项,日志,文件名,目录,Li

    jar运行命令linux?

    jar运行命令linux?,项目,系统,平台,工具,上期,命令,选项,日志,文件名,目录,Li