private void Cleanup() { _game?.Unload(); _game = null; _cartAssemblyContext?.Unload(); SDL.SDL_DestroyTexture(_fontTexture); SDL.SDL_FreeSurface(_fontSurface); SDL.SDL_DestroyTexture(_mainBuffer); SDL.SDL_DestroyTexture(_effectsBuffer); SDL.SDL_DestroyRenderer(_renderer); SDL.SDL_DestroyWindow(_window); SDL.SDL_Quit(); }
private void CompileCart() { Console.Write("Compiling..."); var compilation = CSharpCompilation.Create("cart.dll", new[] { SyntaxFactory.ParseSyntaxTree(_cartCode) }, new[] { MetadataReference.CreateFromFile(typeof(Program).Assembly.Location), MetadataReference.CreateFromFile(typeof(object).Assembly.Location), MetadataReference.CreateFromFile(SystemRuntimeLocation), MetadataReference.CreateFromFile(typeof(Console).Assembly.Location), }, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); var errors = compilation.GetDiagnostics(); if (errors.Length > 0) { Console.WriteLine("Errors:"); foreach (var e in errors) { Console.WriteLine(e); } } else { _cartAssemblyContext?.Unload(); _cartAssemblyContext = new CartAssemblyLoadContext(); Assembly compiledAssembly; using (var ms = new MemoryStream()) { var res = compilation.Emit(ms); ms.Seek(0, SeekOrigin.Begin); compiledAssembly = _cartAssemblyContext.LoadFromStream(ms); } var compiledType = compiledAssembly.GetTypes().FirstOrDefault(t => t.IsSubclassOf(typeof(SharpGame))); if (compiledType == null) { Console.WriteLine("Error:"); Console.WriteLine("No SharpGame defined."); } else { _game = (SharpGame)Activator.CreateInstance(compiledType); Console.WriteLine("Done!"); } } }