/// <summary> /// Runs the asset manager side-by-side with another XNA program /// (for example the main game) and then rebinds the IoC providers /// for asset management so that assets can be changed in real-time. /// </summary> /// <param name="kernel"> /// The kernel. /// </param> /// <param name="startProcess"> /// The start Process. /// </param> /// <returns> /// The <see cref="Process"/>. /// </returns> public static Process RunAndConnect(IKernel kernel, bool startProcess) { #if FALSE var node = new LocalNode(); node.Bind(IPAddress.Loopback, 9838); #endif Process process = null; if (startProcess) { var assemblyPath = Assembly.GetExecutingAssembly().Location; var directory = new FileInfo(assemblyPath).Directory; var filename = Path.Combine(directory.FullName, "ProtogameAssetManager.exe"); if (!File.Exists(filename)) { throw new FileNotFoundException( "You must have ProtogameAssetManager.exe in " + "the same directory as your game."); } process = new Process(); process.StartInfo = new ProcessStartInfo { FileName = filename, Arguments = "--connect" }; process.EnableRaisingEvents = true; process.Exited += (sender, e) => { Environment.Exit(1); }; process.Start(); } #if FALSE var assetManagerProvider = new NetworkedAssetManagerProvider(node, kernel); kernel.Bind <IAssetManagerProvider>().ToMethod(x => assetManagerProvider); // Wait until the networked asset manager is ready. while (!assetManagerProvider.IsReady && (process == null || !process.HasExited)) { Thread.Sleep(100); } #endif return(process); }
internal static void Main(string[] args) { var connectToRunningGame = false; var options = new OptionSet { { "connect", "Internal use only (used by the game client).", v => connectToRunningGame = true } }; try { options.Parse(args); } catch (OptionException ex) { Console.Write("ProtogameAssetManager.exe: "); Console.WriteLine(ex.Message); Console.WriteLine("Try `ProtogameAssetManager.exe --help` for more information."); return; } // Deploy the correct MojoShader DLL. MojoShaderDeploy.Deploy(); var kernel = new StandardKernel(); kernel.Load<Protogame2DIoCModule>(); kernel.Load<ProtogameAssetIoCModule>(); kernel.Load<ProtogameEventsIoCModule>(); kernel.Load<ProtogamePlatformingIoCModule>(); kernel.Load<AssetManagerIoCModule>(); // Only allow the source load strategies. kernel.Unbind<ILoadStrategy>(); kernel.Bind<ILoadStrategy>().To<RawTextureLoadStrategy>(); kernel.Bind<ILoadStrategy>().To<RawModelLoadStrategy>(); kernel.Bind<ILoadStrategy>().To<RawEffectLoadStrategy>(); kernel.Bind<ILoadStrategy>().To<LocalSourceLoadStrategy>(); kernel.Bind<ILoadStrategy>().To<EmbeddedSourceLoadStrategy>(); kernel.Bind<ILoadStrategy>().To<EmbeddedCompiledLoadStrategy>(); var runningFile = new FileInfo(Assembly.GetExecutingAssembly().Location); var workingDirectoryInfo = new DirectoryInfo(Environment.CurrentDirectory); var scannedUnique = new List<string>(); foreach (var file in runningFile.Directory.GetFiles("*.dll")) { if (scannedUnique.Contains(file.FullName)) continue; Console.WriteLine("Scanning " + file.Name); try { RegisterEditorsFromAssembly(Assembly.LoadFrom(file.FullName), kernel); scannedUnique.Add(file.FullName); } catch (BadImageFormatException) { } catch (FileLoadException) { } } foreach (var file in runningFile.Directory.GetFiles("*.exe")) { if (scannedUnique.Contains(file.FullName)) continue; Console.WriteLine("Scanning " + file.Name); try { RegisterEditorsFromAssembly(Assembly.LoadFrom(file.FullName), kernel); scannedUnique.Add(file.FullName); } catch (BadImageFormatException) { } catch (FileLoadException) { } } foreach (var file in workingDirectoryInfo.GetFiles("*.dll")) { if (scannedUnique.Contains(file.FullName)) continue; Console.WriteLine("Scanning " + file.Name); try { RegisterEditorsFromAssembly(Assembly.LoadFrom(file.FullName), kernel); scannedUnique.Add(file.FullName); } catch (BadImageFormatException) { } catch (FileLoadException) { } } foreach (var file in workingDirectoryInfo.GetFiles("*.exe")) { if (scannedUnique.Contains(file.FullName)) continue; Console.WriteLine("Scanning " + file.Name); try { RegisterEditorsFromAssembly(Assembly.LoadFrom(file.FullName), kernel); scannedUnique.Add(file.FullName); } catch (BadImageFormatException) { } catch (FileLoadException) { } } #if FALSE if (connectToRunningGame) { var node = new LocalNode(Architecture.ServerClient, Caching.PushOnChange); node.Bind(IPAddress.Loopback, 9837); node.GetService<IClientConnector>().Connect(IPAddress.Loopback, 9838); var assetManagerProvider = new NetworkedAssetManagerProvider(node, kernel); kernel.Bind<IAssetManagerProvider>().ToMethod(x => assetManagerProvider); } else #endif kernel.Bind<IAssetManagerProvider>().To<LocalAssetManagerProvider>().InSingletonScope(); using (var game = new AssetManagerGame(kernel)) { game.Run(); } }