public LiveAssemblyReloader(Game game, AssemblyContainer assemblyContainer, List<Assembly> assembliesToUnregister, List<Assembly> assembliesToRegister) { if (game != null) this.entities.AddRange(game.SceneSystem.SceneInstance); this.game = game; this.assemblyContainer = assemblyContainer; this.assembliesToUnregister = assembliesToUnregister; this.assembliesToRegister = assembliesToRegister; }
/// <summary> /// Initializes a new instance of the <see cref="PackageSession"/> class. /// </summary> public PackageSession(Package package) { packages = new PackageCollection(); packagesCopy = new PackageCollection(); assemblyContainer = new AssemblyContainer(); packages.CollectionChanged += PackagesCollectionChanged; if (package != null) { Packages.Add(package); } }
/// <summary> /// Initializes a new instance of the <see cref="PackageSession"/> class. /// </summary> public PackageSession(Package package) { constraintProvider.AddConstraint(PackageStore.Instance.DefaultPackageName, new VersionSpec(PackageStore.Instance.DefaultPackageVersion.ToSemanticVersion())); packages = new PackageCollection(); packagesCopy = new PackageCollection(); assemblyContainer = new AssemblyContainer(); packages.CollectionChanged += PackagesCollectionChanged; if (package != null) { Packages.Add(package); } }
public Assembly LoadAssemblyFromPath(string assemblyFullPath, ILogger outputLog = null, List <string> lookupDirectoryList = null) { if (assemblyFullPath == null) { throw new ArgumentNullException("assemblyFullPath"); } log = new LoggerResult(); lookupDirectoryList = lookupDirectoryList ?? new List <string>(); assemblyFullPath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, assemblyFullPath)); var assemblyDirectory = Path.GetDirectoryName(assemblyFullPath); if (assemblyDirectory == null || !Directory.Exists(assemblyDirectory)) { throw new ArgumentException("Invalid assembly path. Doesn't contain directory information"); } if (!lookupDirectoryList.Contains(assemblyDirectory, StringComparer.InvariantCultureIgnoreCase)) { lookupDirectoryList.Add(assemblyDirectory); } var previousLookupList = searchDirectoryList; try { loadingInstance = this; searchDirectoryList = lookupDirectoryList; return(LoadAssemblyFromPathInternal(assemblyFullPath)); } finally { loadingInstance = null; searchDirectoryList = previousLookupList; if (outputLog != null) { log.CopyTo(outputLog); } } }
public Assembly LoadAssemblyFromPath(string assemblyFullPath, ILogger outputLog = null, List<string> lookupDirectoryList = null) { if (assemblyFullPath == null) throw new ArgumentNullException("assemblyFullPath"); log = new LoggerResult(); lookupDirectoryList = lookupDirectoryList ?? new List<string>(); assemblyFullPath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, assemblyFullPath)); var assemblyDirectory = Path.GetDirectoryName(assemblyFullPath); if (assemblyDirectory == null || !Directory.Exists(assemblyDirectory)) { throw new ArgumentException("Invalid assembly path. Doesn't contain directory information"); } if (!lookupDirectoryList.Contains(assemblyDirectory, StringComparer.InvariantCultureIgnoreCase)) { lookupDirectoryList.Add(assemblyDirectory); } var previousLookupList = searchDirectoryList; try { loadingInstance = this; searchDirectoryList = lookupDirectoryList; return LoadAssemblyFromPathInternal(assemblyFullPath); } finally { loadingInstance = null; searchDirectoryList = previousLookupList; if (outputLog != null) { log.CopyTo(outputLog); } } }
public static void Reload(Game game, AssemblyContainer assemblyContainer, List<Assembly> assembliesToUnregister, List<Assembly> assembliesToRegister) { List<Entity> entities = new List<Entity>(); if (game != null) entities.AddRange(game.SceneSystem.SceneInstance); CloneReferenceSerializer.References = new List<object>(); var loadedAssembliesSet = new HashSet<Assembly>(assembliesToUnregister); var reloadedComponents = new List<ReloadedComponentEntryLive>(); var componentsToReload = AssemblyReloader.CollectComponentsToReload(entities, loadedAssembliesSet); foreach (var componentToReload in componentsToReload) { var parsingEvents = SerializeComponent(componentToReload.Component); // TODO: Serialize Scene script too (async?) -- doesn't seem necessary even for complex cases // (i.e. referencing assets, entities and/or scripts) but still a ref counting check might be good reloadedComponents.Add(new ReloadedComponentEntryLive(componentToReload, parsingEvents)); } foreach (var assembly in assembliesToUnregister) { // Unregisters assemblies that have been registered in Package.Load => Package.LoadAssemblyReferencesForPackage AssemblyRegistry.Unregister(assembly); // Unload binary serialization DataSerializerFactory.UnregisterSerializationAssembly(assembly); // Unload assembly assemblyContainer.UnloadAssembly(assembly); } foreach (var assembly in assembliesToRegister) { ModuleRuntimeHelpers.RunModuleConstructor(assembly.ManifestModule); // Unregisters assemblies that have been registered in Package.Load => Package.LoadAssemblyReferencesForPackage AssemblyRegistry.Register(assembly, AssemblyCommonCategories.Assets); DataSerializerFactory.RegisterSerializationAssembly(assembly); } // First pass of deserialization: recreate the scripts foreach (ReloadedComponentEntryLive reloadedScript in reloadedComponents) { // Try to create object var objectStart = reloadedScript.YamlEvents.OfType<MappingStart>().FirstOrDefault(); if (objectStart != null) { // Get type info var objectStartTag = objectStart.Tag; bool alias; var componentType = YamlSerializer.GetSerializerSettings().TagTypeRegistry.TypeFromTag(objectStartTag, out alias); if (componentType != null) { reloadedScript.NewComponent = (EntityComponent)Activator.CreateInstance(componentType); } } } // Second pass: update script references in live objects // As a result, any script references processed by Yaml serializer will point to updated objects (script reference cycle will work!) for (int index = 0; index < CloneReferenceSerializer.References.Count; index++) { var component = CloneReferenceSerializer.References[index] as EntityComponent; if (component != null) { var reloadedComponent = reloadedComponents.FirstOrDefault(x => x.OriginalComponent == component); if (reloadedComponent != null) { CloneReferenceSerializer.References[index] = reloadedComponent.NewComponent; } } } // Third pass: deserialize reloadedComponents.ForEach(x => ReplaceComponent(game, x)); CloneReferenceSerializer.References = null; }
public static void Reload(Game game, AssemblyContainer assemblyContainer, List<Assembly> assembliesToUnregister, List<Assembly> assembliesToRegister) { List<Entity> entities = new List<Entity>(); if (game != null) entities.AddRange(game.SceneSystem.SceneInstance); CloneReferenceSerializer.References = new List<object>(); var loadedAssembliesSet = new HashSet<Assembly>(assembliesToUnregister); var reloadedComponents = new List<ReloadedComponentEntryLive>(); throw new NotImplementedException("Need to reimplement this to use IUnloadable"); foreach (var assembly in assembliesToUnregister) { // Unregisters assemblies that have been registered in Package.Load => Package.LoadAssemblyReferencesForPackage AssemblyRegistry.Unregister(assembly); // Unload binary serialization DataSerializerFactory.UnregisterSerializationAssembly(assembly); // Unload assembly assemblyContainer.UnloadAssembly(assembly); } foreach (var assembly in assembliesToRegister) { ModuleRuntimeHelpers.RunModuleConstructor(assembly.ManifestModule); // Unregisters assemblies that have been registered in Package.Load => Package.LoadAssemblyReferencesForPackage AssemblyRegistry.Register(assembly, AssemblyCommonCategories.Assets); DataSerializerFactory.RegisterSerializationAssembly(assembly); } // First pass of deserialization: recreate the scripts foreach (ReloadedComponentEntryLive reloadedScript in reloadedComponents) { // Try to create object var objectStart = reloadedScript.YamlEvents.OfType<MappingStart>().FirstOrDefault(); if (objectStart != null) { // Get type info var objectStartTag = objectStart.Tag; bool alias; var componentType = AssetYamlSerializer.Default.GetSerializerSettings().TagTypeRegistry.TypeFromTag(objectStartTag, out alias); if (componentType != null) { reloadedScript.NewComponent = (EntityComponent)Activator.CreateInstance(componentType); } } } // Second pass: update script references in live objects // As a result, any script references processed by Yaml serializer will point to updated objects (script reference cycle will work!) for (int index = 0; index < CloneReferenceSerializer.References.Count; index++) { var component = CloneReferenceSerializer.References[index] as EntityComponent; if (component != null) { var reloadedComponent = reloadedComponents.FirstOrDefault(x => x.OriginalComponent == component); if (reloadedComponent != null) { CloneReferenceSerializer.References[index] = reloadedComponent.NewComponent; } } } // Third pass: deserialize reloadedComponents.ForEach(x => ReplaceComponent(game, x)); CloneReferenceSerializer.References = null; }