using System; using System.Reflection; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using System.Collections.ObjectModel; using VisionAsist.Models; using VisionAsist.SDK; namespace VisionAsist.ViewModels; using System.IO; using System.Linq; public class ModuleItem { public string Name { get; set; } public IRelayCommand SettingsCommand { get; set; } } public class SettingsViewModel : ViewModelBase { string Plugin = Path.Combine(AppContext.BaseDirectory, "Modules"); public ObservableCollection Modules { get; } = new(); public SettingsViewModel() { string[] folderNames = new DirectoryInfo(Plugin) .GetDirectories() .Select(d => d.Name) .ToArray(); foreach (string folderName in folderNames) { AddModule(folderName); } } public void AddModule(string name) { Modules.Add(new ModuleItem { Name = name, SettingsCommand = new RelayCommand(() => OpenSettings(name)) }); } private void OpenSettings(string moduleName) { string dllPath = Path.Combine(AppContext.BaseDirectory, "Modules", moduleName, "Module.dll"); if (File.Exists(dllPath)) { Console.OutputEncoding = System.Text.Encoding.UTF8; Console.InputEncoding = System.Text.Encoding.UTF8; Assembly assembly = Assembly.LoadFrom(dllPath); var type = assembly.GetTypes().FirstOrDefault(t => typeof(IModule).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract); if (type != null) { // 4. Создаем экземпляр класса (WeatherModule) var module = (IModule)Activator.CreateInstance(type)!; Console.WriteLine($"Успешно загружен модуль: {module.Name}"); // 5. Запускаем команду и передаем текущее окно (this) в качестве родителя var result = module.Execute("ShowWeather", new object[] { this }); Console.WriteLine($"Ответ модуля: {result}"); } else { Console.WriteLine("В DLL не найден класс, реализующий VisionAsist.SDK.IModule!"); } } } }