13

我正在为我目前正在教授的课程实施一个自动“评估器”。总体思路是每个学生都提供一个实现了一些算法的 DLL。我的评估器使用反射加载所有这些 DLL,找到学生实现并在比赛中评估它们。所有这些算法都是黑盒优化器,它们实现了以下接口

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在类中看到一个字段。问题是,我不希望我的学生能够通过反射或任何其他技术访问xoptorfopt字段,因为那将是作弊,或者至少,找出他们是否这样做,以便我可以相应地惩罚他们;) .

所以,一般的问题是:有没有办法在我动态加载的一段代码中禁止使用反射,或者在任何其他意义上禁止这段代码访问私有字段(作弊)。

提前致谢。

4

3 回答 3

2

他们会给你源代码吗?编写一个单独的工具来查找“使用 System.Reflection”和“System.Reflection”。在源头。如果他们想出一个巧妙的技巧来避免这种情况,也许他们应该通过作弊获得额外的分数。:)

另外,在他们使用的代码中如何处理:

private double FakeOptimumPointWithAConvincingName{ get { return 12.07; } }

然后在运行评估器时将其更改为:

private double FakeOptimumPointWithAConvincingName{ get { throw new SomeoneCheatedException(); } }

沿着这条线还有很多其他聪明的事情要做。关键是您可以使用技巧而不是技术来阻止它们。如果他们想出更好的技巧,那就太棒了。:)

于 2012-06-22T14:05:14.853 回答
1

简短的回答是,只要调用者完全信任,直到 .Net 4.0(有关如何创建高达 .Net.3.5 的沙盒应用程序,请参阅此内容),您无法避免私有或内部方法的反射发现。

对于 .Net 4,您是否阅读过 MSDN 上.Net 4.0 反射的安全注意事项?

于 2012-06-22T12:53:52.240 回答
1

如果您在需要它们的那一刻从配置文件中加载最佳值,那么在此之前很难反映它们

于 2012-06-22T15:12:00.147 回答