Подтвердить что ты не робот

Избегание вызова кода пользователя в 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 в куске кода, который я динамически загрузил, или в любом другом смысле не разрешает этому коду обращаться к закрытым полям (обманывать).

Спасибо заранее.

4b9b3361

Ответ 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

Если вы загрузите оптимальные значения из файла конфигурации в тот момент, когда они вам понадобятся, будет трудно отразить их до этого времени