2012-06-22 11 views
13

Wdrażam automatyczny "oceniający" dla kursu, który obecnie uczę. Ogólny pomysł jest taki, że każdy uczeń dostarcza bibliotekę DLL z zaimplementowanymi algorytmami. Mój oceniający ładuje wszystkie te biblioteki DLL za pomocą Reflection, znajduje implementacje uczniów i ocenia je w turnieju. Wszystkie te algorytmy są optymalizujące black-box, które realizują następujące interfejsUnikanie kodu użytkownika wywołującego odbicie w C#

public interface IContinuousMetaheuristic 
{ 
    // ... Some unimportant properties 
    Vector Evaluate(Function function, int maxEvaluations, ...); 
} 

Definicja klasy dla Function (przynajmniej odpowiednia część) jest:

public class Function: 
{ 
    private Vector xopt; // The optimum point 
    private double fopt; // The optimum value 

    public double Evaluate(Vector x); 
} 

Jak widać, muszę przekazać instancję Function do tych metaheurystyk. Te funkcje są realizowane przeze mnie. Większość z nich jest w pewnym sensie przypadkowa, tzn. Wybieram losowy optymalny punkt w konstruktorze funkcji. Właśnie dlatego możesz zobaczyć w klasie klasę xopt. Problem polega na tym, że nie chcę, aby moi studenci mieli dostęp do pól xopt lub fopt przez Reflection lub jakąkolwiek inną technikę, ponieważ byłoby to oszukiwanie, a przynajmniej dowiedzenie się, czy robią to, więc mogę ich ukarać ;).

Tak więc ogólne pytanie brzmi: czy istnieje sposób, aby zabronić użycia Reflection w kawałku kodu, który wczytałem dynamicznie, lub w jakimkolwiek innym sensie uniemożliwić ten kod dostępu do prywatnych pól (oszukiwanie).

Z góry dziękuję.

+3

Czy 'optymalną point' ** ** muszą być w' Function 'klasa, czy nie możesz po prostu przechowywać go w innej strukturze danych niedostępnej w bibliotece referencyjnej, którą dasz uczniom? –

+2

Czy nie byłoby prostsze po prostu odłączyć funkcję oceny wektora od wartości optymalnych? Jeśli przekażesz je tylko 'Func ', będą mieć trudności z kradzieżą optymalnych odpowiedzi. – Rawling

+3

Możliwe jest również zduplikowanie http://stackoverflow.com/questions/4447939/jest-to-pozwoli- do-uczenia-odbieranie-z -zespołu- – Rawling

Odpowiedz

2

Czy podają kod źródłowy? Napisz osobne narzędzie, które znajduje "przy użyciu System.Reflection" i "System.Reflection." w źródle. Jeśli wymyślają sprytną sztuczkę, aby tego uniknąć, może zasługują na dodatkowe punkty, które otrzymują przez oszukiwanie. :)

Ponadto, co na ten temat w kodzie używają:

private double FakeOptimumPointWithAConvincingName{ get { return 12.07; } } 

Wtedy zmieni się to po uruchomieniu oceniającego:

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

Jest wiele innych sprytnych rzeczy postępuj zgodnie z tą linią; możesz użyć sztuczności zamiast technologii, aby im przeszkodzić. A jeśli wymyślą lepsze sztuczki, kudo. :)

+0

Wolałbym nie przechodzić przez kod źródłowy. Lubię fałszowanie, z wyjątkiem tego, że muszę ciągle zmieniać kod tam, gdzie trzeba, aby dać mu ewaluator, aby mogli trenować. Dostajesz moje pierwsze głosowanie za spryt. –

+0

Dzięki. Nie musisz jednak ciągle przebudowywać, po prostu używaj zawsze innej wersji niż oni. Jeśli nie chcesz, aby mieli pełny dostęp do Twojego kodu, powinieneś dać im coś, co jest nieco inne. – tallseth

+0

Podoba mi się dwie różne opcje kompilacji. Myślę, że będę trzymał się tego podejścia, zważywszy, że zabraknie mi czasu. Dzięki @tallseth i wszystkim innym za ich przydatne odpowiedzi. –

1

Krótka odpowiedź brzmi: tak długo, jak osoba dzwoniąca ma pełne zaufanie, aż do .Net 4.0 (see this, aby utworzyć aplikacje w piaskownicy do wersji .Net 3.5), nie można uniknąć odkrywania metod prywatnych lub wewnętrznych.

Dla .Net 4, czy czytasz Security Considerations for Reflection for .Net 4.0 na MSDN?

+0

Umieściłem atrybut "[SecurityCritical]" na prywatnych polach, ale nadal nie działa. –

1

Jeśli załadować optymalne wartości z configfile momentu ich potrzebujesz trudno będzie odzwierciedlać ich przed tym czasie

+0

Ale w momencie oceny funkcji w kodzie użytkownika ta wartość jest już załadowana, a następnie może odzwierciedlić ją w tym konkretnym czasie. –

+1

Nie, jeśli ładujesz zmienne leniwy. Znaczy to, że są one pobierane tylko tuż przed tym, jak kod ich potrzebuje, a ty zerujesz wartości ponownie zaraz po ich użyciu. W takim przypadku okno, w którym mogą odbijać, będzie bardzo krótkie. – IvoTops

+0

Masz rację @IvoTops. To może być dobry pomysł. Nie jestem jednak pewien, jak uniknąć tego, aby zrobić to samo co ja: ładowanie tego pliku konfiguracyjnego. Jeśli ścieżka konfiguracji jest ustalona, ​​to jest bułka z masłem, jeśli jest przechowywana, może to odzwierciedlić i tak dalej. –