示例#1
0
 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();
 }
示例#2
0
        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!");
                }
            }
        }