Domanda

Sto lavorando a un gioco (C#) che utilizza a Simil-Robocodice modello di programmazione:i partecipanti ereditano una Classe base e aggiungono comportamenti strategici.Il gioco carica quindi le istanze delle classi dei partecipanti e inizia la competizione.Sfortunatamente, i partecipanti possono "imbrogliare" condividendo variabili statiche tra istanze della classe concorrente.

Come posso impedire la condivisione di variabili statiche tra istanze di classe in un linguaggio .NET?So che questo viene ottenuto in Java utilizzando un ClassLoader separato per istanza.Qual è l'equivalente .NET?

Inoltre, i miei test mostrano che AppDomain separati funzionano solo quando si carica una classe che estende MarshalByRefObject.Immagino che questo abbia senso: se carichi semplicemente una classe serializzabile, la classe viene copiata nell'AppDomain corrente in modo che un secondo oggetto da un AppDomain diverso condividerà le sue variabili statiche.MarshalByRefObject garantisce che solo un proxy venga caricato nell'AppDomain corrente e che i dati statici rimangano nell'AppDomain in caricamento.Guarda anche: http://blogs.msdn.com/ericlippert/archive/2004/05/27/143203.aspx

È stato utile?

Soluzione

Carica ciascun concorrente in un AppDomain diverso.

Altri suggerimenti

le variabili statiche sono per AppDomain, quindi potresti esaminare l'utilizzo di AppDomain diversi, ma non so assolutamente quali altre conseguenze potrebbero avere.

Altrimenti potresti controllare in anticipo le classi utilizzando la riflessione e rifiutare qualsiasi classe che abbia membri statici.

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

Non ho una risposta specifica, ma guarderei .NET Terrario progetto.Tutti i partecipanti sono DLL caricate dall'utente.Hanno fatto molte cose belle per impedire il caricamento/l'esecuzione di codice non sicuro e fraudolento.

Justin Rogers lo ha fatto scritto ampiamente sui dettagli di implementazione del terrario.

Quello è soluzione nel plugin .NET per Robocode reale su cui sto lavorando.

L'attributo [ThreadStatic] funzionerebbe per te?Finché i tuoi giocatori si trovano in thread diversi, probabilmente basterebbe.Dal sito MSDN:

Un campo statico (condiviso in Visual Basic) contrassegnato con ThreadStaticAttribute non è condiviso tra i thread.Ogni thread in esecuzione ha un'istanza separata del campo e imposta in modo indipendente e ottiene valori per quel campo.Se si accede al campo su un thread diverso, conterrà un valore diverso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top