diff --git a/src/CodemerxDecompile/ViewModels/MainWindowViewModel.cs b/src/CodemerxDecompile/ViewModels/MainWindowViewModel.cs index 9c3326e3..af92ae1b 100644 --- a/src/CodemerxDecompile/ViewModels/MainWindowViewModel.cs +++ b/src/CodemerxDecompile/ViewModels/MainWindowViewModel.cs @@ -245,7 +245,7 @@ private async Task OpenFile() if (files.Count == 0) return; - + _ = analyticsService.TrackEventAsync(AnalyticsEvents.OpenFile); LoadAssemblies(files.Select(file => file.Path.LocalPath)); @@ -300,6 +300,7 @@ internal void LoadAssemblies(IEnumerable filePaths) // TODO: Rebuild all reference nodes upon loading of a new assembly // TODO: Invalidate search results AssemblyNode? firstLoadedAssemblyNode = null; + var alreadyLoadedAssemblyNames = new List(); foreach (var filePath in filePaths) { @@ -348,6 +349,13 @@ internal void LoadAssemblies(IEnumerable filePaths) var assembly = GlobalAssemblyResolver.Instance.GetAssemblyDefinition(filePath); if (assembly == null) continue; + + var assemblyName = assembly.Name.Name; + if (AssemblyNodes.Select(node => node.Name).Contains(assemblyName)) + { + alreadyLoadedAssemblyNames.Add(assemblyName); + continue; + } if (hasAccessToDirectory) { @@ -413,8 +421,17 @@ internal void LoadAssemblies(IEnumerable filePaths) assemblies.Add(assembly); ClearAssemblyListCommand.NotifyCanExecuteChanged(); } + + SelectedNode = firstLoadedAssemblyNode ?? SelectedNode; - SelectedNode = firstLoadedAssemblyNode; + if (alreadyLoadedAssemblyNames.Any()) + { + notificationService.ShowNotification(new() + { + Message = $"The following assemblies are already open:\n" + string.Join(",\n", alreadyLoadedAssemblyNames), + Level = NotificationLevel.Error + }); + } TypeNode BuildTypeSubtree(TypeDefinition typeDefinition, Node parentNode) {