2008-09-17 17 views
1

Robocode-likeプログラミングモデルを使用するゲーム(C#)で作業しています。参加者は基本クラスを継承し、戦略的な振る舞いを追加します。その後、ゲームは参加者のクラスのインスタンスを読み込み、競争が始まります。残念なことに、参加者は、競合クラスのインスタンス間で静的変数を共有することによって、 "不正行為"することができます。.NETランタイムでの静的変数の共有を防止するにはどうすればよいですか?

.NET言語でのクラスインスタンス間の静的変数の共有を防止するにはどうすればよいですか。これは、インスタンスごとに別々のClassLoaderを使用することで、Javaで実現されることがわかります。 .NETと同等のものは何ですか?ソリューションに事前に

おかげで...

注:私のテストは、MarshalByRefObjectをを拡張するクラスをロードするときに、別のAppDomainにのみ動作することを示しています。これは意味があると思います。シリアライザブルクラスをロードするだけであれば、クラスは現在のAppDomainにコピーされ、別のAppDomainの2番目のオブジェクトが静的な変数を共有するようになります。 MarshalByRefObjectは、現在のAppDomainにプロキシだけがロードされ、スタティックはロード中のAppDomainの後ろにとどまることを保証します。以下を参照してください。http://blogs.msdn.com/ericlippert/archive/2004/05/27/143203.aspx

答えて

8

各競合他社を異なるAppDomainに読み込みます。

+0

競合他社の相互作用(競合)を妨げるものではありませんか? –

+3

いいえ、さまざまなappdomain間でインターフェイスをマーシャリングし、通信がインターフェイスの提供するものだけに制限されるためです。 –

7

静的変数はAppDomainごとに異なるので、異なるAppDomainsを使用して調べることができますが、他にどのような影響があるのか​​全くわかりません。

これ以外の場合は、事前にリフレクションを使用してクラスをチェックし、静的メンバーを持つクラスを拒否することができます。

0

具体的な回答はありませんが、.NET Terrariumプロジェクトを見ていきます。すべての参加者は、ユーザーが読み込んだDLLです。彼らは、安全でないコードと不正なコードが読み込まれたり実行されたりするのを防ぐために、多くの素敵なことをしてきました。

Justin RogersはTerrariumの実装の詳細についてwritten extensivelyを持っています。私が働いている本物のRobocodeのための.NETプラグインでsolution

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

0

あなたは[ThreadStatic]属性を使用できますか?あなたのプレーヤーが別のスレッドにいる限り、おそらくトリックを行うだろう。 MSDNのサイトから:

フィールドstatic(Visual BasicではShared)が ThreadStaticAttributeでマークされたスレッド間 を共有されません。各実行スレッド は、フィールドの別のインスタンス を持ち、独立してそのフィールドに値 を設定して取得します。フィールドが異なるスレッドでアクセスされた の場合、 には異なる値が含まれます。

関連する問題