由于用户的Excel版本可能是2003、2007 CAD版本可能是2000到2010,如何比较好的实现多版本呢?并且不需要修改程序代码 以下是一个简单的利用反射实现的例子,希望大家多提意见,谢谢 (VS2008,.net framework3.5,添加了System.Configuration引用,实现2个按钮事件) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices;//使用Marshal获得进程 using System.Reflection;//用于反射 using System.Configuration;//操作app.config文件 namespace SeedFileReport { public partial class Main : Form { //string excelAssPath; //string CADAssPath; string ExcelVer; string CADVer; //Assembly excelAss; //Assembly CADAss; Type excelType; Type CADType; object excelApp; object CADApp; string AppPath; string ExcelAppProID; string CADAppProID; public Main() { InitializeComponent(); AppPath = System.Windows.Forms.Application.StartupPath; //Debug文件的上一级目录,不包含斜杠\ AppPath = AppPath.Substring(0, AppPath.LastIndexOf("\\")); } //Excel private void button1_Click(object sender, EventArgs e) { //修改为通过注册表来创建进程Excel.Application.11/Excel.Application.12 ExcelVer = System.Configuration.ConfigurationManager.AppSettings["ExcelVer"].ToString(); if (ExcelVer == "2003") { //excelAssPath = AppPath + @"\Dll\Excel\2003\Microsoft.Office.Interop.Excel.dll"; ExcelAppProID="Excel.Application.11"; //excelAssPath = @"C:\WINDOWS\assembly\GAC\Microsoft.Office.Interop.Excel\11.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll"; } if (ExcelVer == "2007") { //excelAssPath = AppPath + @"\Dll\Excel\2007\Microsoft.Office.Interop.Excel.dll"; ExcelAppProID="Excel.Application.12"; //excelAssPath = @"C:\WINDOWS\assembly\GAC\Microsoft.Office.Interop.Excel\12.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll"; } //excelAss = Assembly.LoadFile(excelAssPath); //excelType = excelAss.GetType("Microsoft.Office.Interop.Excel.ApplicationClass"); excelType = System.Type.GetTypeFromProgID(ExcelAppProID); //excelApp = excelAss.CreateInstance("Microsoft.Office.Interop.Excel.ApplicationClass"); excelApp = Activator.CreateInstance(excelType); object[] par = new object[1]; par[0] = true; excelType.InvokeMember("Visible", BindingFlags.SetProperty, null, excelApp, new object[] { true }); excelType.InvokeMember("UserControl", BindingFlags.SetProperty, null, excelApp, par); //获取Workbook集 object objBooks = excelApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, excelApp, null); //添加一个新的Workbook object objBook = objBooks.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, objBooks, null); //获取Sheet集 object objSheets = objBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, objBook, null); //获取第一个Sheet对象 object[] Parameters = new Object[1] { 3 }; object objSheet = objSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, objSheets, Parameters); objSheet.GetType().InvokeMember("Activate", BindingFlags.InvokeMethod , null, objSheet, null); object Cells1 = objSheet.GetType().InvokeMember("Cells", BindingFlags.GetProperty, null, objSheet, new object[] { 1, 1 }); Cells1.GetType().InvokeMember("NumberFormatLocal", BindingFlags.SetProperty, null, Cells1, new object[] { "@" }); Cells1.GetType().InvokeMember("FormulaR1C1", BindingFlags.SetProperty, null, Cells1, new object[] { "反射测试" }); //foreach (Module aaa in excelAss.GetModules()) //{ // Console.WriteLine(aaa.Name); // 显示该dll下所有的类 //} object range = objSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, objSheet, new object[] { "B2:G8"}); range.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, range, new object[] { "反射Excel.Range成功啦!" }); //反射枚举型 //System.Type t1 = excelAss.GetType("Microsoft.Office.Interop.Excel.XlRangeValueDataType"); //object[] o1s = t1.GetMembers(); //object o1 = t1.GetMember("xlRangeValueDefault"); //MessageBox.Show(o1.GetType().ToString()); //range.GetType().InvokeMember("set_Value", BindingFlags.InvokeMethod, null, range, new object[] {o1, "反射B" }); //object res = range.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, range, null); } //CAD private void button2_Click(object sender, EventArgs e) { //获得解决方案的所有Assembly //Assembly[] AX = AppDomain.CurrentDomain.GetAssemblies(); //遍历显示每个Assembly的名字 //foreach (object var in AX) //{ // Console.WriteLine("Assembly的名字:" + var.ToString()); //} CADVer = System.Configuration.ConfigurationManager.AppSettings["AutoCADVer"].ToString(); //修改为通过注册表来创建进程AutoCAD.Application.16/AutoCAD.Application.17 if (CADVer == "2004") { //CADAssPath = AppPath + @"\Dll\AutoCAD\2004\Interop.AutoCAD.dll"; //CADAssPath = AppPath + @"\Dll\AutoCAD\2006\Autodesk.AutoCAD.Interop.dll"; CADAppProID = "AutoCAD.Application.16"; //CADAssPath = @"C:\WINDOWS\assembly\GAC\Autodesk.AutoCAD.Interop\16.2.54.0__eed84259d7cbf30b\Autodesk.AutoCAD.Interop.dll"; } if (CADVer == "2006") { //CADAssPath = AppPath + @"\Dll\AutoCAD\2006\Autodesk.AutoCAD.Interop.dll"; CADAppProID = "AutoCAD.Application.16"; //CADAssPath = @"C:\WINDOWS\assembly\GAC\Autodesk.AutoCAD.Interop\16.2.54.0__eed84259d7cbf30b\Autodesk.AutoCAD.Interop.dll"; } if (CADVer == "2007") { //CADAssPath = AppPath + @"\Dll\AutoCAD\2007\Autodesk.AutoCAD.Interop.dll"; CADAppProID = "AutoCAD.Application.17"; //CADAssPath = @"C:\WINDOWS\assembly\GAC_MSIL\Autodesk.AutoCAD.Interop\17.2.0.0__eed84259d7cbf30b\Autodesk.AutoCAD.Interop.dll"; } //CADAss = Assembly.LoadFile(CADAssPath); //if (CADVer == "2004") //{ // CADType = CADAss.GetType("AutoCAD.AcadApplicationClass"); //} //if (CADVer != "2004") //{ // CADType = CADAss.GetType("Autodesk.AutoCAD.Interop.AcadApplicationClass"); //} CADType = System.Type.GetTypeFromProgID(CADAppProID); CADApp = Activator.CreateInstance(CADType); object[] par = new object[1]; par[0] = true; CADType.InvokeMember("Visible", BindingFlags.SetProperty, null, CADApp, par);
//获取Documents集 object objDocs = CADApp.GetType().InvokeMember("Documents", BindingFlags.GetProperty, null, CADApp, null); //添加一个新的Document object objDoc = objDocs.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, objDocs, new object[]{Missing.Value}); //获得模型空间 object objModel = objDoc.GetType().InvokeMember("ModelSpace", BindingFlags.GetProperty, null, objDoc, null); object[] LinePar = new object[2]; LinePar[0] = new double[] { 10, 20, 0 }; LinePar[1] = new double[] { 120, 190, 0 }; object objLine = objModel.GetType().InvokeMember("AddLine", BindingFlags.InvokeMethod, null, objModel, LinePar); System.Type typeLine = objLine.GetType(); object length = objLine.GetType().InvokeMember("Length", BindingFlags.GetProperty, null, objLine, null); object[] CirPar = new object[2]; CirPar[0] = new double[] { 3, 70, 0 }; CirPar[1] = 150; object objCir = objModel.GetType().InvokeMember("AddCircle", BindingFlags.InvokeMethod, null, objModel, CirPar); object center = objLine.GetType().InvokeMember("Center", BindingFlags.GetProperty, null, objCir, null); object[] TxtPar = new object[3]; TxtPar[0] = "CAD" + CADVer + "Reflect Success!"; TxtPar[1] = new double[] { 0, 0, 0 }; TxtPar[2] = 23; object objTxt = objModel.GetType().InvokeMember("AddText", BindingFlags.InvokeMethod, null, objModel, TxtPar); object layer = objLine.GetType().InvokeMember("Layer", BindingFlags.GetProperty, null, objTxt, null); } } }
|