91手机视频在线-91手机视频在线观看-91手机在线-91手机在线播放-91手机在线观看

完善主體資料,免費贈送VIP會員!
* 主體類型
* 企業名稱
* 信用代碼
* 所在行業
* 企業規模
* 所在職位
* 姓名
* 所在行業
* 學歷
* 工作性質
請先選擇行業
您還可以選擇以下福利:
行業福利,領完即止!

下載app免費領取會員

NULL

ad.jpg

二次開發教程:Revit開發AddinManager原理探索

發布于:2019-08-26 16:07:33

網友投稿

更多

Revit開發中AddinManager是一個非常好用的工具,它可以快速的運行我們寫好的命令


并且生成addin文件,最近突然好奇,它是怎么實現這些功能的,然后研究了一下,


發現這里面似乎是通過反射來實現的,他能運行我們的寫的命令最關鍵的是因為下面的代碼


             IExternalCommand externalCommand = assembly.CreateInstance(FullClassName) as IExternalCommand;

            if (externalCommand != null)

            {

                result = externalCommand Execute( commandData, ref message,  elements)

            }          




因為用反射創建我們寫的命令的類之前,我們要先加載dll,而加載dl后,如果加載dll的位置和我們生成dll的位置相同


當我們再編譯原來的工程就會失敗,因為我們生成的dll要替換原來的dll,而原來的dll已經被占用,所有就會替換失敗,


我想著就是AddInManager 運行命令之前,要先把dll文件復制到其他地方的原因吧




下面嘗試些一個簡單的AddInManager,并不包括將dll復制到其他地方,和生成addin文件的功能




   //創建界面


    public class MyApp:IExternalApplication

    {

        public Result OnShutdown(UIControlledApplication application)

        {

            return Result.Succeeded;

        }

        public Result OnStartup(UIControlledApplication application)

        {

            RibbonPanel panel = application.CreateRibbonPanel(Tab.AddIns, "NewAddInManager");

            PushButtonData data = new PushButtonData("NewAddinManager", "MyCommand", this.GetType().Assembly.Location, "NewAddinManager.MyAddInCommand");

            panel.AddItem(data);

            return Result.Succeeded;

        }

    }


// addinManager 命令


    public class MyAddInCommand : IExternalCommand

    {

        public string path = null;

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)

        {

            AppDomain.CurrentDomain.AssemblyResolve += LoadAssemble;

            Result result;

            OpenFileDialog dialog = new OpenFileDialog();

            if (dialog.ShowDialog() == DialogResult.OK)

            {

                string file = dialog.FileName;

                path = new FileInfo(file).DirectoryName;

                Assembly ab = Assembly.LoadFile(file);

                foreach (Type tp in ab.DefinedTypes)

                {

                    IExternalCommand icmd = ab.CreateInstance(tp.FullName) as IExternalCommand;

                    if (icmd != null)

                    {

                        result = icmd.Execute(commandData, ref message, elements);

                        break;

                    }

                }

            }

            return Result.Succeeded;

        }



        private Assembly LoadAssemble(object sender, ResolveEventArgs args)

        {        

            string dllName = args.Name.Split(new char[] { ',' }).First();

            Assembly tab = args.RequestingAssembly;        

            FileInfo fileInfo = new FileInfo(tab.Location);

            DirectoryInfo dir = fileInfo.Directory;// new DirectoryInfo(path);

            FileInfo[] files = dir.GetFiles("*.dll", SearchOption.TopDirectoryOnly);

            foreach (FileInfo f in files)

            {               

                if (f.Name.Contains(dllName))

                {

                    Assembly ab = Assembly.LoadFile(f.FullName);

                    return ab;

                }

            }           

            return null;

        }

    }

本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

未標題-1.jpg

上一篇:二次開發教程:Revit開發之梁柱分段

下一篇:二次開發教程:Revit開發之AddInManager安裝包簡單制作

主站蜘蛛池模板: 综合网视频 | 毛片一| 日本v片免费一区二区三区 日本wwwwwxxxxx | 欧美国产合集在线视频 | 偷自拍第一页 | 色在线影院 | 豆国产97在线 | 中国 | 特黄毛片| 天天久久综合网站 | 毛片免费看牛牛影视 | 高清性色生活片免费视频软件 | 国内精品免费视频 | 欧美精品播放 | 欧美一级特黄aaaaaaa在线观看 | 国产精品爱久久久久久久小 | 亚洲精品福利在线 | 欧美在线二区 | 伊人久久中文字幕久久cm | 日本黄色免费观看 | a级黄色网址 | 777奇米影视笫四色88me久久综合 | 中文在线第一页 | 日韩高清成人 | 中国成熟xxx视频 | 大杳焦伊人久久综合热 | 欧美大片在线观看 | 国产日产精品久久久久快鸭 | 我想看黄色一级片 | 亚洲六月丁香六月婷婷花 | 三级黄色在线视频 | 久久99精品视频在线在线观看 | 久久精品国产999久久久 | 久久久免费视频播放 | 日本亚洲国产精品久久 | 亚洲精品国产精品国自产观看 | 天天影视欲香欲色成人网 | 日韩亚洲国产综合久久久 | 亚洲欧美色中文字幕 | 欧美精品不卡 | 狼人久草 | 一级毛片中文字幕 |