mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-03 00:00:49 +08:00
153 lines
5.5 KiB
C#
153 lines
5.5 KiB
C#
using Microsoft.Win32;
|
||
using Serein.NodeFlow;
|
||
using Serein.NodeFlow.Tool;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Reflection;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows;
|
||
using System.Windows.Controls;
|
||
using System.Windows.Data;
|
||
using System.Windows.Documents;
|
||
using System.Windows.Forms;
|
||
using System.Windows.Input;
|
||
using System.Windows.Media;
|
||
using System.Windows.Media.Imaging;
|
||
using System.Windows.Shapes;
|
||
|
||
namespace Serein.Workbench.Themes
|
||
{
|
||
/// <summary>
|
||
/// DynamicCompilerApp.xaml 的交互逻辑
|
||
/// </summary>
|
||
public partial class DynamicCompilerView : Window
|
||
{
|
||
private static int count = 1;
|
||
private readonly DynamicCompiler _compiler;
|
||
/// <summary>
|
||
/// 脚本代码
|
||
/// </summary>
|
||
public string ScriptCode { get => codeEditor.Text; set => codeEditor.Text = value; }
|
||
/// <summary>
|
||
/// 编译成功回调
|
||
/// </summary>
|
||
public Action<FlowLibrary> OnCompileComplete { get; set; }
|
||
public DynamicCompilerView()
|
||
{
|
||
InitializeComponent();
|
||
textboxAssemblyName.Text = $"FlowLibrary{count}";
|
||
_compiler = new DynamicCompiler();
|
||
// 初始化代码编辑器
|
||
//codeEditor.Text =
|
||
}
|
||
|
||
private void btnAdd_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
var openFileDialog = new Microsoft.Win32.OpenFileDialog
|
||
{
|
||
Filter = "DLL文件|*.dll|所有文件|*.*",
|
||
Title = "选择要引用的DLL文件"
|
||
};
|
||
|
||
if (openFileDialog.ShowDialog() == true)
|
||
{
|
||
try
|
||
{
|
||
_compiler.AddReference(openFileDialog.FileName);
|
||
lstReferences.Items.Add(openFileDialog.FileName);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
System.Windows.MessageBox.Show($"添加引用失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||
}
|
||
}
|
||
}
|
||
|
||
private void btnBatchAdd_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
using (var folderDialog = new FolderBrowserDialog())
|
||
{
|
||
folderDialog.Description = "选择包含DLL文件的文件夹";
|
||
if (folderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
||
{
|
||
try
|
||
{
|
||
string[] dllFiles = Directory.GetFiles(folderDialog.SelectedPath, "*.dll", SearchOption.AllDirectories);
|
||
int successCount = 0;
|
||
int failCount = 0;
|
||
|
||
foreach (string dllFile in dllFiles)
|
||
{
|
||
try
|
||
{
|
||
_compiler.AddReference(dllFile);
|
||
lstReferences.Items.Add(dllFile);
|
||
successCount++;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
failCount++;
|
||
System.Diagnostics.Debug.WriteLine($"添加引用失败 {dllFile}: {ex.Message}");
|
||
}
|
||
}
|
||
|
||
System.Windows.MessageBox.Show($"批量添加完成!\n成功:{successCount}个\n失败:{failCount}个",
|
||
"批量添加结果",
|
||
MessageBoxButton.OK,
|
||
failCount > 0 ? MessageBoxImage.Warning : MessageBoxImage.Information);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
System.Windows.MessageBox.Show($"批量添加过程中发生错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
private void btnRemove_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
if (lstReferences.SelectedItem != null)
|
||
{
|
||
lstReferences.Items.Remove(lstReferences.SelectedItem);
|
||
}
|
||
}
|
||
|
||
private void lstReferences_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
|
||
{
|
||
if (lstReferences.SelectedItem != null)
|
||
{
|
||
System.Windows.MessageBox.Show(lstReferences.SelectedItem.ToString(), "引用路径", MessageBoxButton.OK, MessageBoxImage.Information);
|
||
}
|
||
}
|
||
|
||
private void btnCompile_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
txtErrors.Clear();
|
||
var code = codeEditor.Text;
|
||
var path = textboxAssemblyName.Text;
|
||
Assembly assembly = _compiler.Compile(code, path);
|
||
|
||
FlowLibrary flowLibrary = new FlowLibrary(assembly, path);
|
||
|
||
if (assembly != null)
|
||
{
|
||
txtErrors.Text = "编译成功!";
|
||
txtErrors.Background = System.Windows.Media.Brushes.LightGreen;
|
||
OnCompileComplete.Invoke(flowLibrary);
|
||
count++;
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
txtErrors.Text = $"编译错误:\n{ex.Message}";
|
||
txtErrors.Background = System.Windows.Media.Brushes.LightPink;
|
||
}
|
||
}
|
||
}
|
||
}
|