Ponownie skompiluj C # podczas pracy bez domen aplikacji

Powiedzmy, że mam dwie aplikacje C # -game.exe (XNA, musi obsługiwać Xbox 360) ieditor.exe (XNA hostowane w WinForms) - obie dzieląengine.dll montaż, który wykonuje zdecydowaną większość pracy.

Powiedzmy, że chcę dodać skrypty oparte na C # (nie jest to „skryptowanie”, ale tak to nazywam). Każdy poziom otrzymuje własną klasę odziedziczoną po klasie bazowej (nazwiemy toLevelController).

Są to ważne ograniczenia dla tych skryptów:

Muszą być prawdziwym, skompilowanym kodem C #

Powinny wymagać minimalnej ręcznej „klejenia”, jeśli w ogóle

Muszą działać w tej samej domenie aplikacji, co wszystko inne

W grze - jest to całkiem proste: wszystkie klasy skryptów można skompilować w zespół (powiedzmy,levels.dll), a poszczególne klasy mogą być inicjowane za pomocą odbicia, w razie potrzeby.

Edytor jest znacznie trudniejszy. Edytor ma możliwość „grania w grę” w oknie edytora, a następnie resetowania wszystkiego do miejsca, w którym się rozpoczął (dlatego redaktor musi wiedzieć o tych skryptach w pierwszej kolejności).

To, co próbuję osiągnąć, to przycisk „przeładuj skrypt” w edytorze, który przekompiluje i załaduje klasę skryptu powiązaną z edytowanym poziomem, a gdy użytkownik naciśnie przycisk „play”, utwórz instancję najnowszego skompilowany skrypt.

Efektem tego będzie szybki przepływ pracy w edytorze testowym (zamiast alternatywy - czyli zapisanie poziomu, zamknięcie edytora, ponowna kompilacja rozwiązania, uruchomienie edytora, załadowanie poziomu, test).

Teraz jamyśleć Wypracowałem potencjalny sposób osiągnięcia tego celu - co prowadzi do wielu pytań (podanych poniżej):

Skompiluj kolekcję.cs pliki wymagane na danym poziomie (lub, w razie potrzeby, całelevels.dll projekt) w tymczasowy, unikatowy zespół. Ten zespół będzie musiał się odwołaćengine.dll. Jak wywołać kompilator w ten sposób w czasie wykonywania? Jak zmusić go do wysłania takiego zestawu (i czy mogę to zrobić w pamięci)?

Załaduj nowy zespół. Czy będzie miało znaczenie, że ładuję klasy o tej samej nazwie do tego samego procesu? (Mam wrażenie, że nazwy są kwalifikowane przez nazwę zespołu?)

Teraz, jak już wspomniałem, nie mogę używać domen aplikacji. Ale z drugiej strony, nie mam nic przeciwko wyciekaniu starych wersji klas skryptów, więc możliwość rozładowania nie jest ważna. Chyba że tak jest? Zakładam, że ładowanie może kilkuset zespołów jest możliwe.

Podczas odtwarzania poziomu instancja klasy, która jest dziedziczona z LevelController z określonego zestawu, który został właśnie załadowany. Jak to zrobić?

I w końcu:

Czy to rozsądne podejście? Czy można to zrobić lepiej?

AKTUALIZACJA: Obecnie używam aznacznie prostsze podejście rozwiązać podstawowy problem.

questionAnswers(4)

yourAnswerToTheQuestion