Ejemplo n.º 1
0
 private static void OnPluginReady(CorePlugin plugin)
 {
     if (PluginReady != null)
     {
         PluginReady(null, new CorePluginEventArgs(plugin));
     }
 }
Ejemplo n.º 2
0
 private static void UnloadPlugin(CorePlugin plugin)
 {
     disposedPlugins.Add(plugin.PluginAssembly);
     OnDiscardPluginData(new[] { plugin });
     plugins.Remove(plugin.AssemblyName);
     try
     {
         plugin.Dispose();
     }
     catch (Exception e)
     {
         Log.Core.WriteError("Error disposing plugin {1}: {0}", Log.Exception(e), plugin.AssemblyName);
     }
 }
Ejemplo n.º 3
0
        private static void LoadPlugins()
        {
            UnloadPlugins();

            Log.Core.Write("Scanning for core plugins...");
            Log.Core.PushIndent();

            if (Directory.Exists("Plugins"))
            {
                string[] pluginDllPaths = Directory.GetFiles("Plugins", "*.core.dll", SearchOption.AllDirectories);
                foreach (string dllPath in pluginDllPaths)
                {
                    Log.Core.Write("{0}...", dllPath);
                    Log.Core.PushIndent();
                    try
                    {
                        Assembly pluginAssembly;
                        if (environment == ExecutionEnvironment.Launcher)
                        {
                            pluginAssembly = Assembly.LoadFrom(dllPath);
                        }
                        else
                        {
                            pluginAssembly = Assembly.Load(File.ReadAllBytes(dllPath));
                        }
                        Type pluginType = pluginAssembly.GetExportedTypes().FirstOrDefault(t => typeof(CorePlugin).IsAssignableFrom(t));
                        if (pluginType == null)
                        {
                            Log.Core.WriteWarning("Can't find CorePlugin class. Discarding plugin...");
                            disposedPlugins.Add(pluginAssembly);
                            continue;
                        }
                        CorePlugin plugin = (CorePlugin)pluginType.CreateInstanceOf();
                        plugins.Add(plugin.AssemblyName, plugin);
                    }
                    catch (Exception e)
                    {
                        Log.Core.WriteError("Error loading plugin: {0}", Log.Exception(e));
                    }
                    Log.Core.PopIndent();
                }
            }

            Log.Core.PopIndent();
        }
Ejemplo n.º 4
0
		public void BeforeTest(TestDetails details)
		{
			Console.WriteLine("----- Beginning Duality environment setup -----");

			// Set environment directory to Duality binary directory
			this.oldEnvDir = Environment.CurrentDirectory;
			string codeBaseURI = typeof(DualityApp).Assembly.CodeBase;
			string codeBasePath = codeBaseURI.StartsWith("file:") ? codeBaseURI.Remove(0, "file:".Length) : codeBaseURI;
			codeBasePath = codeBasePath.TrimStart('/');
			Environment.CurrentDirectory = Path.GetDirectoryName(codeBasePath);

			// Add some Console logs manually for NUnit
			if (!Log.Game.Outputs.OfType<ConsoleLogOutput>().Any())
			{
				if (this.consoleLogOutput == null) this.consoleLogOutput = new ConsoleLogOutput();
				Log.Game.AddOutput(this.consoleLogOutput);
				Log.Core.AddOutput(this.consoleLogOutput);
				Log.Editor.AddOutput(this.consoleLogOutput);
			}

			// Initialize Duality
			DualityApp.Init(DualityApp.ExecutionEnvironment.Launcher, DualityApp.ExecutionContext.Game);

			// Manually register pseudo-plugin for the Unit Testing Assembly
			this.unitTestPlugin = DualityApp.LoadPlugin(typeof(DualityTestsPlugin).Assembly, codeBasePath);

			// Create a dummy window, to get access to all the device contexts
			if (this.dummyWindow == null)
			{
				this.dummyWindow = new GameWindow(800, 600);
				this.dummyWindow.Context.LoadAll();
				this.dummyWindow.Visible = true;
				this.dummyWindow.Context.Update(this.dummyWindow.WindowInfo);
				this.dummyWindow.MakeCurrent();
				this.dummyWindow.ProcessEvents();
				DualityApp.TargetResolution = new Vector2(this.dummyWindow.Width, this.dummyWindow.Height);
				DualityApp.TargetMode = this.dummyWindow.Context.GraphicsMode;
				ContentProvider.InitDefaultContent();
			}

			// Load local testing memory
			TestHelper.LocalTestMemory = Formatter.TryReadObject<TestMemory>(TestHelper.LocalTestMemoryFilePath, FormattingMethod.Xml);

			Console.WriteLine("----- Duality environment setup complete -----");
		}
Ejemplo n.º 5
0
		public void BeforeTest(TestDetails details)
		{
			Console.WriteLine("----- Beginning Duality environment setup -----");

			// Set environment directory to Duality binary directory
			this.oldEnvDir = Environment.CurrentDirectory;
			string codeBaseURI = typeof(DualityApp).Assembly.CodeBase;
			string codeBasePath = codeBaseURI.StartsWith("file:") ? codeBaseURI.Remove(0, "file:".Length) : codeBaseURI;
			codeBasePath = codeBasePath.TrimStart('/');
			Environment.CurrentDirectory = Path.GetDirectoryName(codeBasePath);

			// Add some Console logs manually for NUnit
			if (!Log.Core.Outputs.OfType<TextWriterLogOutput>().Any(o => o.Target == Console.Out))
			{
				if (this.consoleLogOutput == null) this.consoleLogOutput = new TextWriterLogOutput(Console.Out);
				Log.AddGlobalOutput(this.consoleLogOutput);
			}

			// Initialize Duality
			DualityApp.Init(
				DualityApp.ExecutionEnvironment.Launcher, 
				DualityApp.ExecutionContext.Game, 
				new DefaultPluginLoader(),
				null);

			// Manually register pseudo-plugin for the Unit Testing Assembly
			this.unitTestPlugin = DualityApp.LoadPlugin(typeof(DualityTestsPlugin).Assembly, codeBasePath);

			// Create a dummy window, to get access to all the device contexts
			if (this.dummyWindow == null)
			{
				WindowOptions options = new WindowOptions
				{
					Width = 800,
					Height = 600
				};
				this.dummyWindow = DualityApp.OpenWindow(options);
			}

			// Load local testing memory
			TestHelper.LocalTestMemory = Serializer.TryReadObject<TestMemory>(TestHelper.LocalTestMemoryFilePath, typeof(XmlSerializer));

			Console.WriteLine("----- Duality environment setup complete -----");
		}
Ejemplo n.º 6
0
        internal static void ReloadPlugin(string pluginFileName)
        {
            if (!pluginFileName.EndsWith(".core.dll", StringComparison.InvariantCultureIgnoreCase))
            {
                Log.Core.Write("Skipping non-core plugin '{0}'...", pluginFileName);
                return;
            }
            Log.Core.Write("Reloading core plugin '{0}'...", pluginFileName);
            Log.Core.PushIndent();

            // Load new plugin
            Assembly   pluginAssembly = Assembly.Load(File.ReadAllBytes(pluginFileName));
            Type       pluginType     = pluginAssembly.GetExportedTypes().FirstOrDefault(t => typeof(CorePlugin).IsAssignableFrom(t));
            CorePlugin plugin         = (CorePlugin)pluginType.CreateInstanceOf();

            // If we're overwriting an old plugin here, add the old version to the "disposed" blacklist
            CorePlugin oldPlugin;

            if (plugins.TryGetValue(plugin.AssemblyName, out oldPlugin))
            {
                disposedPlugins.Add(oldPlugin.PluginAssembly);
                oldPlugin.Dispose();
            }

            // Register newly loaded plugin
            plugins[plugin.AssemblyName] = plugin;

            // Discard temporary plugin-related data (cached Types, etc.)
            OnDiscardPluginData(new[] { oldPlugin });

            Log.Core.PopIndent();

            // Init plugin
            if (initialized)
            {
                plugin.InitPlugin();
                OnPluginReady(plugin);
            }
        }
Ejemplo n.º 7
0
		public CorePluginEventArgs(CorePlugin plugin)
		{
			this.plugin = plugin;
		}
Ejemplo n.º 8
0
 internal static void InitPlugin(CorePlugin plugin)
 {
     pluginManager.InitPlugin(plugin);
 }
Ejemplo n.º 9
0
		private static void OnPluginReady(CorePlugin plugin)
		{
			if (PluginReady != null)
				PluginReady(null, new CorePluginEventArgs(plugin));
		}
Ejemplo n.º 10
0
		internal static void InitPlugin(CorePlugin plugin)
		{
			try
			{
				plugin.InitPlugin();
				OnPluginReady(plugin);
			}
			catch (Exception e)
			{
				Log.Core.WriteError("Error initializing plugin {1}: {0}", Log.Exception(e), plugin.AssemblyName);
				RemovePlugin(plugin);
			}
		}
Ejemplo n.º 11
0
		private static void RemovePlugin(CorePlugin plugin)
		{
			// Dispose plugin and discard plugin related data
			disposedPlugins.Add(plugin.PluginAssembly);
			OnDiscardPluginData();
			plugins.Remove(plugin.AssemblyName);
			try
			{
				plugin.Dispose();
			}
			catch (Exception e)
			{
				Log.Core.WriteError("Error disposing plugin {1}: {0}", Log.Exception(e), plugin.AssemblyName);
			}

			// Discard temporary plugin-related data (cached Types, etc.)
			CleanupAfterPlugins(new[] { plugin });
		}
Ejemplo n.º 12
0
		/// <summary>
		/// Determines whether the specified plugin is referenced by any other plugin.
		/// </summary>
		/// <param name="plugin"></param>
		/// <returns></returns>
		public static bool IsDependencyPlugin(CorePlugin plugin)
		{
			foreach (CorePlugin loadedPlugin in plugins.Values)
			{
				AssemblyName[] refNames = loadedPlugin.PluginAssembly.GetReferencedAssemblies();
				if (refNames.Any(rn => rn.Name == plugin.AssemblyName)) return true;
			}
			return false;
		}
Ejemplo n.º 13
0
		private static void UnloadPlugin(CorePlugin plugin)
		{
			disposedPlugins.Add(plugin.PluginAssembly);
			OnDiscardPluginData();
			plugins.Remove(plugin.AssemblyName);
			try
			{
				plugin.Dispose();
			}
			catch (Exception e)
			{
				Log.Core.WriteError("Error disposing plugin {1}: {0}", Log.Exception(e), plugin.AssemblyName);
			}
			CleanupAfterPlugins(new[] { plugin });
		}
Ejemplo n.º 14
0
		private static void UnloadPlugin(CorePlugin plugin)
		{
			OnDiscardPluginData(new[] { plugin });
			plugins.Remove(plugin.AssemblyName);
			disposedPlugins.Add(plugin.PluginAssembly);
			plugin.Dispose();
		}
Ejemplo n.º 15
0
 public CorePluginEventArgs(CorePlugin plugin)
 {
     this.plugin = plugin;
 }