完善主體資料,免費贈送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安裝包簡單制作

      主站蜘蛛池模板: 国产99久久精品一区二区| 丝袜人妻一区二区三区| 亚洲中文字幕一区精品自拍 | 国产伦精品一区二区三区无广告| 精品国产一区二区三区四区| 久久精品一区二区东京热| 亚洲AV日韩AV天堂一区二区三区| 97久久精品午夜一区二区 | 激情内射亚洲一区二区三区| 在线观看亚洲一区二区| 日本福利一区二区| 熟女大屁股白浆一区二区| 日韩欧国产精品一区综合无码| 亚洲乱码一区二区三区国产精品 | 亚洲一区二区三区夜色| 欧美av色香蕉一区二区蜜桃小说 | 怡红院美国分院一区二区| 国产一区二区三区播放| 久久久人妻精品无码一区| 亚洲AV无码一区二区三区系列| 波多野结衣一区二区三区| 日韩精品无码Av一区二区| 久久久国产精品无码一区二区三区| 动漫精品第一区二区三区| 精品一区二区三区四区在线播放 | 国产嫖妓一区二区三区无码| 激情内射亚州一区二区三区爱妻| 少妇特黄A一区二区三区| 国模大胆一区二区三区| 亚洲一区二区电影| 一区二区三区精品高清视频免费在线播放| 国产成人无码一区二区三区在线| 国产韩国精品一区二区三区久久| 亚洲av成人一区二区三区在线观看| 亚洲一区二区三区高清| 精品一区二区三区色花堂| 亚洲AV日韩AV一区二区三曲| 久久国产午夜一区二区福利| 婷婷国产成人精品一区二 | 国产精品成人一区无码 | 日韩一区在线视频|