Как предотвратить совместное использование статических переменных в среде выполнения .NET? - PullRequest
1 голос
/ 17 сентября 2008

Я работаю над игрой (C #), в которой используется Робокодоподобная модель программирования : участники наследуют базовый класс и добавляют стратегическое поведение. Затем игра загружает экземпляры классов участников и начинается соревнование. К сожалению, участники могут «обманывать», разделяя статические переменные между экземплярами класса своего конкурента.

Как предотвратить совместное использование статических переменных между экземплярами класса в языке .NET? Я знаю, что это достигается в Java с помощью отдельного ClassLoader для каждого экземпляра. Что такое эквивалент .NET?

Кроме того, мое тестирование показывает, что отдельные домены приложений работают только при загрузке класса, расширяющего MarshalByRefObject. Я предполагаю, что это имеет смысл - если вы просто загружаете Serializable Class, этот класс копируется в текущий AppDomain, поэтому второй объект из другого AppDomain будет использовать свои статические переменные. MarshalByRefObject гарантирует, что в текущий AppDomain загружен только прокси, а статические данные остаются в загружаемом AppDomain. Смотрите также: http://blogs.msdn.com/ericlippert/archive/2004/05/27/143203.aspx

Ответы [ 6 ]

8 голосов
/ 17 сентября 2008

Загрузите каждого конкурента в отдельный домен приложений.

7 голосов
/ 17 сентября 2008

статические переменные относятся к каждому домену приложений, так что вы можете изучить использование разных доменов приложений, но я совершенно не знаю, какие могут быть другие последствия.

В противном случае вы можете проверить классы заранее, используя отражение, и отклонить любые классы, которые имеют статические члены.

2 голосов
/ 17 сентября 2008
if(typeof(CompetitorClass).GetFields(BindingFlags.Static))
{
 // take necessary steps against cheater!
}
0 голосов
/ 15 января 2010

Будет ли работать атрибут [ThreadStatic] для вас? Пока ваши игроки находятся в разных темах, это, вероятно, поможет. С сайта MSDN:

Статический (Общий в Visual Basic) поле отмечено ThreadStaticAttribute не является общим между нитями. Каждый исполняющий поток имеет отдельный экземпляр поля, и самостоятельно устанавливает и получает значения для этого поля. Если поле доступ к другой теме, это будет содержать другое значение.

0 голосов
/ 15 января 2010

Это решение в плагине .NET для реального Robocode, над которым я работаю.

0 голосов
/ 17 сентября 2008

У меня нет конкретного ответа, но я бы посмотрел на проект .NET Terrarium . Все участники являются загруженными пользователем DLL. Они сделали много полезных вещей, чтобы предотвратить загрузку и выполнение небезопасного и читерского кода.

Джастин Роджерс написал , подробно о деталях реализации Terrarium.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...