using System; using System.Collections.Generic; using System.IO; using System.Windows; using CodeForge; using Microsoft.Win32; namespace Plugins.Script.Views { /// /// 程序集引用管理对话框(照 CodeForge Demo 的引用管理器做法):ListBox + 添加 DLL / 移除 / 关闭。 /// 全部走 CodeEditorControl 的字符串 API(GetReferenceNames / InstallAndReferenceDll / RemoveReferenceByName), /// 添加的 DLL 由控件自动归档到运行目录 References\,编辑器补全与流程运行期(ScriptCompiler 扫描同目录)共用。 /// public partial class ScriptReferenceDialog : Window { private readonly CodeEditorControl _editor; public ScriptReferenceDialog(CodeEditorControl editor, Window owner) { _editor = editor; InitializeComponent(); if (owner != null) Owner = owner; Reload(); } private void Reload() { var names = new List(); try { foreach (var n in _editor.GetReferenceNames()) { if (!string.IsNullOrEmpty(n) && !names.Contains(n)) names.Add(n); } } catch { /* 取引用名失败则显示空列表 */ } names.Sort(StringComparer.OrdinalIgnoreCase); RefsList.ItemsSource = names; } private void BtnAdd_Click(object sender, RoutedEventArgs e) { var dlg = new OpenFileDialog { Title = "添加引用(选择 .NET 程序集)— 会自动归档到运行目录 References\\", Filter = ".NET 程序集 (*.dll, *.exe)|*.dll;*.exe|所有文件 (*.*)|*.*", Multiselect = true }; try { var refsDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Runtime\\References"); if (Directory.Exists(refsDir)) dlg.InitialDirectory = refsDir; } catch { } if (dlg.ShowDialog(this) != true) return; foreach (var path in dlg.FileNames) { bool ok = false; try { ok = _editor.InstallAndReferenceDll(path); } catch (Exception ex) { MessageBox.Show(this, "添加异常:" + Path.GetFileName(path) + "\n" + ex.Message, "程序集引用管理", MessageBoxButton.OK, MessageBoxImage.Warning); } if (!ok) { MessageBox.Show(this, "添加失败:" + Path.GetFileName(path) + "\n(该文件未进入 References\\,不会被引用;详见主界面输出)", "程序集引用管理", MessageBoxButton.OK, MessageBoxImage.Warning); } } Reload(); } private void BtnRemove_Click(object sender, RoutedEventArgs e) { var sel = RefsList.SelectedItem as string; if (string.IsNullOrEmpty(sel)) { MessageBox.Show(this, "请先选中列表中要移除的引用", "程序集引用管理", MessageBoxButton.OK, MessageBoxImage.Information); return; } try { _editor.RemoveReferenceByName(sel); } catch (Exception ex) { MessageBox.Show(this, "移除失败:" + sel + "\n" + ex.Message, "程序集引用管理", MessageBoxButton.OK, MessageBoxImage.Warning); } Reload(); } private void BtnClose_Click(object sender, RoutedEventArgs e) { Close(); } } }