Esempio n. 1
0
        /// <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,
            });
        }
Esempio n. 2
0
        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;
        }