我正在为我正在教授的课程实施一个自动“评估员”。总的想法是每个学生都提供了一些DLL,并实现了一些算法。我的评估者使用Reflection加载所有这些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
字段的原因。问题是,我不希望我的学生能够通过Reflection或任何其他技术访问xopt
或fopt
字段,因为这会欺骗,或者至少会发现他们是否这样做我可以相应地惩罚他们;)。
所以,一般的问题是:有没有办法不允许在我动态加载的代码中使用Reflection,或者在任何其他意义上禁止此代码访问私有字段(作弊)。
提前致谢。
答案 0 :(得分:2)
他们会给你源代码吗?编写一个单独的工具,找到“using System.Reflection”和“System.Reflection”。在源头。如果他们想出一个聪明的伎俩来避免这种情况,也许他们应该得到欺骗所带来的额外分数。 :)
此外,他们使用的代码中有这个:
private double FakeOptimumPointWithAConvincingName{ get { return 12.07; } }
然后在运行评估程序时将其更改为:
private double FakeOptimumPointWithAConvincingName{ get { throw new SomeoneCheatedException(); } }
在这条线上还有许多其他聪明的事情要做;重点是你可以使用技巧而不是技术来挫败它们。如果他们想出更好的技巧,那就值得称赞。 :)
答案 1 :(得分:1)
简短的回答是,只要调用者完全信任,直到.Net 4.0(see this如何创建沙盒应用程序到.Net.3.5),你就无法避免私有或内部的反射发现方法
对于.Net 4,您是否在MSDN上阅读了Security Considerations for Reflection for .Net 4.0?
答案 2 :(得分:1)
如果您在需要时从配置文件中加载最佳值,那么在此之前很难反映它们