zoukankan      html  css  js  c++  java
  • 第三方窗口的集成2

    接着上一篇,今天做了一点小改动,使用反射实例化对象来实现可插拔,即换掉功能dll,即可嵌入不同的CAD软件,操作不同的CAD软件。

    这几天看了MVC,打算用这个模式,生搬硬套了一番,感觉还是很别扭。还是改回了我的野路子。

    一共三个主要的类:

    MainForm(主窗体)、BaseModel(模型基类)、SldModel(solidworks的模型类,继承至BaseModel)

    对比MVC,我没有C,M和V直接发送关系。

     public class BaseModel
        {
            //1.启动
            virtual public bool Start()
            {
                return true;       
            }
    
            //2.关闭
            virtual public bool Kill()
            {
                return true; 
            }
    
            //3.获取主程序
            virtual public void GetApp()
            {
               
            }
        }
        public class SldModel:BaseModel
        {public SldWorks.SldWorks Appprivate void StartProcess(object path)
            {
                ProcessStartInfo MyStarInfo = new ProcessStartInfo();
                MyStarInfo.FileName = (string)path;
                ////窗口起始状态最大化
                MyStarInfo.WindowStyle = ProcessWindowStyle.Maximized;
                Process MyProcees = new Process();
                MyProcees.StartInfo = MyStarInfo;
                MyProcees.Start();
                MyProcees.WaitForInputIdle();
            }
    
            public override bool Start()
            {
                try
                {
                    //启动
                    StartProcess("D:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe");
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    
            public override bool Kill()
            {
                try
                {
                    App.ExitApp();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    
            public override void GetApp()
            {
              Thread.Sleep(5000);//等待启动完成     
              App = (SldWorks.SldWorks)Marshal.GetActiveObject("SldWorks.Application.24");
            } 
    
        }

    以上是BaseModel和SldModel

    接下来,在MainForm的load事件里面添加如下代码,

    C:UsersAdministratorDocumentsVisual Studio 2012ProjectsLiuAddinMDIinDebugmodel下面是SldModel所在的dll的文件夹。
            private void Form1_Load(object sender, EventArgs e)
            {
                
                //根据model下面的dll生成菜单栏
                //遍历sldPath下面所有的文件
                DirectoryInfo inf = new DirectoryInfo(@"C:UsersAdministratorDocumentsVisual Studio 2012ProjectsLiuAddinMDIinDebugmodel");
                FileInfo[] dirInf = inf.GetFiles();
    
                foreach (FileInfo file in dirInf)
                {
                    string ifileName = file.FullName;
                    ToolStripMenuItem toolItem = new ToolStripMenuItem (file.Name);
                    新建ToolStripMenuItem.DropDownItems.Add(toolItem);
                    toolItem.Click+=toolItem_Click;
                }
            }

    然后定义toolItem_Click事件,根据不同的菜单实例化不同的对象,调用。另外,菜单的名称我懒得改了,就是dll的名称。实际用的时候,可以改一下。

    这样,下次你要加一个CATIA,写一个对应的dll,写相应的model类继承至BaseModel类,把这个dll放在

    C:UsersAdministratorDocumentsVisual Studio 2012ProjectsLiuAddinMDIinDebugmodel
            private void toolItem_Click(object sender, EventArgs e)
            {
                ToolStripMenuItem toolItem = (ToolStripMenuItem)sender;
                string dllname = toolItem.Text;
                string fullName = "C:\Users\Administrator\Documents\Visual Studio 2012\Projects\LiuAddin\MDI\bin\Debug\model\" + dllname;
                //通过dllname反射实例化
                Assembly assembly = Assembly.LoadFile(fullName); // 加载程序集(EXE 或 DLL) 
                BaseModel model = (BaseModel)assembly.CreateInstance("SldModel.SldModel"); // 创建类的实例 
    
                model.Start();
                bool success = AddinForm("SolidWorks",  "SOLIDWORKS Premium 2016 x64 版", 50);
                if (success == false)
                {
                    MessageBox.Show("等待超时,或者启动失败");
                }
                ThreadStart threadstart = new ThreadStart(model.GetApp);
                Thread thread = new Thread(threadstart);
                thread.Start();
            }
  • 相关阅读:
    Benelux Algorithm Programming Contest 2016 Preliminary K. Translators’ Dinner(思路)
    Benelux Algorithm Programming Contest 2016 Preliminary Target Practice
    Benelux Algorithm Programming Contest 2016 Preliminary I. Rock Band
    Benelux Algorithm Programming Contest 2016 Preliminary A. Block Game
    ICPC Northeastern European Regional Contest 2019 Apprentice Learning Trajectory
    ICPC Northeastern European Regional Contest 2019 Key Storage
    2018 ACM ICPC Asia Regional
    2018 ACM ICPC Asia Regional
    Mybatis入库出现异常后,如何捕捉异常
    优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止
  • 原文地址:https://www.cnblogs.com/hosseini/p/7660510.html
Copyright © 2011-2022 走看看