第三方窗口的集成2
阿新 • • 發佈:2017-10-13
名稱 完成 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 voidStartProcess(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