接着上一篇,今天做了一点小改动,使用反射实例化对象来实现可插拔,即换掉功能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(); }