내 게임의 코드를 동적으로 변경하고 싶습니다.대용량의 데이터를 동적 코드로 처리하십시오.
class GameState {
public int SomeData;
public Entity[] EntityPool;
}
interface IServices {
IRenderer Renderer { get; }
}
interface IGameCode {
void RenderAndUpdate(GameState currentState, IServices serviceProvider);
}
내가 지금과 같은 코드를 쓸 수 원하는 :
이미 사용void MainLoop() {
IGameCode gameCode = new DefaultGameCode();
while(true) {
// Handle Plattform things
if(shouldUseNewGameCode) {
UnloadCode(gameCode);
gameCode = LoadCode("new.dll");
// or
gameCode = LoadCode("new.cs");
}
// Call GameTick
gameCode.RenderAndUpdate(gameState, services);
}
}
응용 프로그램 도메인과 Proxyclass하지만 직렬화 너무 느리다 예를 들어 내 게임이 이런 식으로 구성되어 말할 수의 경우 모든 프레임. 나는 포인터를 전달하려고했지만 AppDomains가 자신의 가상 주소 공간을 사용하기 때문에 GameState 객체에 액세스 할 수 없습니다. 내 다른 생각은 GetMethodBody()를 통해 컴파일 된 메서드에서 IL을 가져 와서 DynamicMethod에 전달하기 위해 Reflection을 사용하는 것이지만 IGameCode 구현에서 Submethods 또는 Variables를 사용할 수 없기 때문에 RenderAndUpdate 메서드를 작성하는 방법을 제한합니다. .
그래서 내가하고 싶은 것을 어떻게 할 수 있습니까?
왜 다른 AppDomain에서 dll을로드합니까? 기본 도메인에로드하고 사용하십시오. 새로운 도메인을 만들고, 도메인을로드하고, 도메인을 항상 찢어서 얻을 수있는 이점은 무엇입니까? –
@SriramSakthivel : 전체 AppDomain을 언로드하고 새로운 DLL로로드하여 새로운 버전의 DLL을 얻을 수 있다는 이점이 있습니다. –
@JohnSaunders하지만 OP는 dll이나 다른 DLL의 새 버전을로드하지 않는 것 같습니다. 그는 나를 위해 같은 DLL을 반복해서하고있는 것처럼 보입니다. 나는 틀릴 수도 있지만 OP의 코드는 그렇게 말하고있다. –