71 lines
2.4 KiB
C#
71 lines
2.4 KiB
C#
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<ModuleItem> 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!");
|
||
}
|
||
}
|
||
|
||
}
|
||
} |