1. 程式人生 > >第三方窗口的集成2

第三方窗口的集成2

名稱 完成 als idle max 等待 visual str 所在

接著上一篇,今天做了一點小改動,使用反射實例化對象來實現可插拔,即換掉功能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:\Users\Administrator\Documents\Visual Studio 2012\Projects\LiuAddin\MDI\bin\Debug\model下面是SldModel所在的dll的文件夾。
        private void Form1_Load(object sender, EventArgs e)
        {
            
            //根據model下面的dll生成菜單欄
            //遍歷sldPath下面所有的文件
            DirectoryInfo inf = new DirectoryInfo(@"C:\Users\Administrator\Documents\Visual Studio 2012\Projects\LiuAddin\MDI\bin\Debug\model");
            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:\Users\Administrator\Documents\Visual Studio 2012\Projects\LiuAddin\MDI\bin\Debug\model
        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();
        }

第三方窗口的集成2