Work Modules

This commit is contained in:
2026-03-19 13:58:29 +02:00
parent 7fde404b5a
commit 0dd13c5a8b
4 changed files with 67 additions and 44 deletions

View File

@@ -1,8 +1,8 @@
using Avalonia.Controls; using Avalonia.Controls;
using VisionAsist.SDK;
namespace ModuleWeather; namespace ModuleWeather;
public class WeatherModule public class WeatherModule : IModule
{ {
public string Name => "Прогноз Погоды"; public string Name => "Прогноз Погоды";

View File

@@ -4,21 +4,31 @@
<TargetFramework>net10.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<!-- ВОТ ЭТА СТРОЧКА: она заставит компилятор создать Module.dll -->
<AssemblyName>Module</AssemblyName>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\VisionAsist.SDK\VisionAsist.SDK.csproj" /> <ProjectReference Include="..\VisionAsist.SDK\VisionAsist.SDK.csproj" />
</ItemGroup> </ItemGroup>
<!-- Твой скрипт копирования остается без изменений, теперь он найдет файл -->
<Target Name="CopyModuleToCore" AfterTargets="PostBuildEvent">
<ItemGroup>
<ModuleFiles Include="$(TargetDir)Module.dll" />
<ModuleFiles Include="$(TargetDir)Module.pdb" Condition="Exists('$(TargetDir)Module.pdb')" />
</ItemGroup>
<Message Text="Копирую Module.dll в папку ядра..." Importance="high" />
<Copy SourceFiles="@(ModuleFiles)"
DestinationFolder="E:\Project\Visual\VisionAsist\VisionAsist\bin\Debug\net10.0\Modules\ModuleWeather"
OverwriteReadOnlyFiles="true" />
</Target>
<ItemGroup> <ItemGroup>
<Compile Update="MainWindow.axaml.cs"> <PackageReference Include="Avalonia" Version="11.3.12" />
<DependentUpon>MainWindow.axaml</DependentUpon> <PackageReference Include="Avalonia.Desktop" Version="11.3.12" />
</Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> </Project>
<PackageReference Include="Avalonia" Version="11.3.12" />
<PackageReference Include="Avalonia.Desktop" Version="11.3.12" />
</ItemGroup>
</Project>

View File

@@ -1,19 +1,47 @@
using System; using System;
using Avalonia.Controls; using System.IO;
using System.Reflection;
using VisionAsist.SDK; using VisionAsist.SDK;
using System.Threading.Tasks; using System.Collections.Generic;
using VisionAsist.SDK;
using System.Linq;
namespace VisionAsist.Models; namespace VisionAsist.Models;
public class Core public class Core
{ {
public static Dictionary<string, IModule> _loadedModules = new();
public static TrigerCore triger = new(); public static TrigerCore triger = new();
public static string TextAsist; public static string TextAsist;
static string Plugin = Path.Combine(AppContext.BaseDirectory, "Modules");
static Core() static Core()
{ {
Console.OutputEncoding = System.Text.Encoding.UTF8; Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.InputEncoding = System.Text.Encoding.UTF8; Console.InputEncoding = System.Text.Encoding.UTF8;
string[] folderNames = new DirectoryInfo(Plugin)
.GetDirectories()
.Select(d => d.Name)
.ToArray();
foreach (string folderName in folderNames)
{
string mpn = Path.Combine(Plugin, folderName, "Module.dll");
if (File.Exists(mpn))
{
Assembly assembly = Assembly.LoadFrom(mpn);
var type = assembly.GetTypes().FirstOrDefault(t =>
typeof(IModule).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);
if (type != null)
{
var module = (IModule)Activator.CreateInstance(type)!;
Core._loadedModules.Add(module.Name, module);
}
}
}
} }
public static void StartListing() public static void StartListing()

View File

@@ -5,10 +5,10 @@ using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using VisionAsist.Models; using VisionAsist.Models;
using VisionAsist.SDK; using VisionAsist.SDK;
namespace VisionAsist.ViewModels;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
namespace VisionAsist.ViewModels;
public class ModuleItem public class ModuleItem
{ {
public string Name { get; set; } public string Name { get; set; }
@@ -17,18 +17,18 @@ public class ModuleItem
public class SettingsViewModel : ViewModelBase public class SettingsViewModel : ViewModelBase
{ {
string Plugin = Path.Combine(AppContext.BaseDirectory, "Modules");
public ObservableCollection<ModuleItem> Modules { get; } = new(); public ObservableCollection<ModuleItem> Modules { get; } = new();
public SettingsViewModel() public SettingsViewModel()
{ {
string[] folderNames = new DirectoryInfo(Plugin)
.GetDirectories() foreach (string Name in Core._loadedModules.Keys)
.Select(d => d.Name)
.ToArray();
foreach (string folderName in folderNames)
{ {
AddModule(folderName);
AddModule(Name);
} }
} }
@@ -43,29 +43,14 @@ public class SettingsViewModel : ViewModelBase
private void OpenSettings(string moduleName) private void OpenSettings(string moduleName)
{ {
string dllPath = Path.Combine(AppContext.BaseDirectory, "Modules", moduleName, "Module.dll");
if (File.Exists(dllPath)) var module = Core._loadedModules.Values.FirstOrDefault(m => m.Name == moduleName);
if (module != null)
{ {
Console.OutputEncoding = System.Text.Encoding.UTF8; module.Execute("ShowWeather", new object[] { this });
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!");
}
} }
} }
} }