Избегание вызова кода пользователя в Reflection в С#
Я использую автоматический "оценщик" для курса, который я сейчас преподаю. Общая идея заключается в том, что каждый ученик предоставляет DLL с некоторыми реализованными алгоритмами. Мой оценщик загружает все эти библиотеки DLL с помощью Reflection, находит реализацию учащегося и оценивает их в турнире. Все эти алгоритмы - это оптимизаторы "черного ящика", которые реализуют следующий интерфейс
public interface IContinuousMetaheuristic
{
// ... Some unimportant properties
Vector Evaluate(Function function, int maxEvaluations, ...);
}
Определение класса для Function
(по крайней мере, соответствующей части):
public class Function:
{
private Vector xopt; // The optimum point
private double fopt; // The optimum value
public double Evaluate(Vector x);
}
Как вы можете видеть, мне нужно передать экземпляр Function
в эти метаэвристики. Эти функции выполняются мною. Большинство из них в некотором смысле случайны, то есть я выбираю случайную оптимальную точку в конструкторе функции. Вот почему вы можете увидеть поле xopt
в классе. Проблема в том, что я не хочу, чтобы мои ученики имели доступ к полям xopt
или fopt
Reflection или любой другой техникой, поскольку это было бы обманом или, по крайней мере, выяснить, делают ли они это, поэтому я могут наказать их соответственно;).
Итак, общий вопрос: есть ли способ запретить использование Reflection в куске кода, который я динамически загрузил, или в любом другом смысле не разрешает этому коду обращаться к закрытым полям (обманывать).
Спасибо заранее.
Ответы
Ответ 1
Они дают вам исходный код? Напишите отдельный инструмент, который находит "using System.Reflection" и "System.Reflection". в источнике. Если они придумают хитрый трюк, чтобы этого избежать, возможно, они заслуживают дополнительных очков, которые они получают путем обмана.:)
Кроме того, как насчет этого в коде, который они используют:
private double FakeOptimumPointWithAConvincingName{ get { return 12.07; } }
Затем измените это, когда вы запустите свой оценщик:
private double FakeOptimumPointWithAConvincingName{ get { throw new SomeoneCheatedException(); } }
Там есть много других умных вещей; То есть вы можете использовать хитрость вместо технологии, чтобы помешать им. И если они придумают лучшие трюки, лакони.:)
Ответ 2
Короткий ответ заключается в том, что до тех пор, пока у вызывающего есть полное доверие, до .Net 4.0 (см. это о том, как создавать изолированные приложения вверх к .Net 3.5), вы не можете избежать отражения открытия частных или внутренних методов.
Для .Net 4 вы прочитали Вопросы безопасности для Reflection для .Net 4.0 в MSDN?
Ответ 3
Если вы загрузите оптимальные значения из файла конфигурации в тот момент, когда они вам понадобятся, будет трудно отразить их до этого времени