/// <summary> /// 将命令转为插件 /// </summary> /// <param name="cmd">通过反射获取的功能命令</param> /// <param name="appPath">插件所属应用软件的位置,插件的命令位置将设置为对于应用程序的相对路径</param> /// <returns></returns> public static PluginItem FromCommand(ICommand cmd, string appPath) { var type = cmd.GetType(); var assemblyPath = FileOpt.GetRelativePath(type.Assembly.Location, appPath); return(new PluginItem { Id = Guid.NewGuid().ToString(), Name = cmd.Name, Text = cmd.Text, AssemblyPath = assemblyPath, TypeName = type.FullName, Tips = cmd.Description, Visible = true, InvokType = EPluginInvokeType.OnClick, Command = cmd, }); }
private void TreeViewMenus_DragDrop(object sender, DragEventArgs e)//在完成拖放操作时 { var targeTreeView = (TreeView)sender; var sourceNode = (TreeNode)e.Data.GetData(typeof(TreeNode));//获得拖动过来的节点 if (sourceNode == null) { return; } var point = targeTreeView.PointToClient(new Point { X = e.X, Y = e.Y }); var targetNode = targeTreeView.GetNodeAt(point);//根据鼠标坐标获得目标节点 if (targetNode == null) { return; } var tag = sourceNode.Tag; var pluginItem = tag is ICommand cmd?PluginItem.FromCommand(cmd, PluginDir) : tag as PluginItem; //特殊处理:由于Assembly.LoadFrom方法反射程序集A会被缓存, //随后再反射同名但路径不同的程序集B,因缓存原因实际反射的仍是程序集A的奇葩机制,目前未找到解决方案,此处只能强行替代程序集的路径 pluginItem.AssemblyPath = Path.Combine(PluginDir, Path.GetFileName(pluginItem.AssemblyPath)); pluginItem.AssemblyPath = FileOpt.GetRelativePath(pluginItem.AssemblyPath, PluginDir); var insertNode = pluginItem.CreateNode(4); AppendToMenu(targetNode, insertNode); if (sourceNode.TreeView == targeTreeView) { sourceNode.Remove(); } targeTreeView.SelectedNode = insertNode; }