ScriptReferenceDialog.xaml.cs 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Windows;
  5. using CodeForge;
  6. using Microsoft.Win32;
  7. namespace Plugins.Script.Views
  8. {
  9. /// <summary>
  10. /// 程序集引用管理对话框(照 CodeForge Demo 的引用管理器做法):ListBox + 添加 DLL / 移除 / 关闭。
  11. /// 全部走 CodeEditorControl 的字符串 API(GetReferenceNames / InstallAndReferenceDll / RemoveReferenceByName),
  12. /// 添加的 DLL 由控件自动归档到运行目录 References\,编辑器补全与流程运行期(ScriptCompiler 扫描同目录)共用。
  13. /// </summary>
  14. public partial class ScriptReferenceDialog : Window
  15. {
  16. private readonly CodeEditorControl _editor;
  17. public ScriptReferenceDialog(CodeEditorControl editor, Window owner)
  18. {
  19. _editor = editor;
  20. InitializeComponent();
  21. if (owner != null) Owner = owner;
  22. Reload();
  23. }
  24. private void Reload()
  25. {
  26. var names = new List<string>();
  27. try
  28. {
  29. foreach (var n in _editor.GetReferenceNames())
  30. {
  31. if (!string.IsNullOrEmpty(n) && !names.Contains(n)) names.Add(n);
  32. }
  33. }
  34. catch { /* 取引用名失败则显示空列表 */ }
  35. names.Sort(StringComparer.OrdinalIgnoreCase);
  36. RefsList.ItemsSource = names;
  37. }
  38. private void BtnAdd_Click(object sender, RoutedEventArgs e)
  39. {
  40. var dlg = new OpenFileDialog
  41. {
  42. Title = "添加引用(选择 .NET 程序集)— 会自动归档到运行目录 References\\",
  43. Filter = ".NET 程序集 (*.dll, *.exe)|*.dll;*.exe|所有文件 (*.*)|*.*",
  44. Multiselect = true
  45. };
  46. try
  47. {
  48. var refsDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Runtime\\References");
  49. if (Directory.Exists(refsDir)) dlg.InitialDirectory = refsDir;
  50. }
  51. catch { }
  52. if (dlg.ShowDialog(this) != true) return;
  53. foreach (var path in dlg.FileNames)
  54. {
  55. bool ok = false;
  56. try { ok = _editor.InstallAndReferenceDll(path); }
  57. catch (Exception ex)
  58. {
  59. MessageBox.Show(this, "添加异常:" + Path.GetFileName(path) + "\n" + ex.Message,
  60. "程序集引用管理", MessageBoxButton.OK, MessageBoxImage.Warning);
  61. }
  62. if (!ok)
  63. {
  64. MessageBox.Show(this,
  65. "添加失败:" + Path.GetFileName(path) + "\n(该文件未进入 References\\,不会被引用;详见主界面输出)",
  66. "程序集引用管理", MessageBoxButton.OK, MessageBoxImage.Warning);
  67. }
  68. }
  69. Reload();
  70. }
  71. private void BtnRemove_Click(object sender, RoutedEventArgs e)
  72. {
  73. var sel = RefsList.SelectedItem as string;
  74. if (string.IsNullOrEmpty(sel))
  75. {
  76. MessageBox.Show(this, "请先选中列表中要移除的引用", "程序集引用管理",
  77. MessageBoxButton.OK, MessageBoxImage.Information);
  78. return;
  79. }
  80. try { _editor.RemoveReferenceByName(sel); }
  81. catch (Exception ex)
  82. {
  83. MessageBox.Show(this, "移除失败:" + sel + "\n" + ex.Message, "程序集引用管理",
  84. MessageBoxButton.OK, MessageBoxImage.Warning);
  85. }
  86. Reload();
  87. }
  88. private void BtnClose_Click(object sender, RoutedEventArgs e) { Close(); }
  89. }
  90. }