1. 程式人生 > >cad.net IExtensionApplication接口的妙用 驚驚

cad.net IExtensionApplication接口的妙用 驚驚

獲得 cte classname inter editor tor 執行 dom 修改

cad提供的 IExtensionApplication 接口 是不能實現一次以上的,那麽這給編寫代碼帶來了一種不好的情況是,每次都要去修改實現這個接口的類,

如果是一個小的測試功能,你又要去動前面的核心,這樣就感覺很蛋疼....

所以我是這麽想的,在實現IExtensionApplication接口的 Initialize 和 Terminate

用反射來反射某個接口(仿IExtensionApplication接口的),然後搜下面接口的 Initialize 和 Terminate,然後運行這個函數.

仿IExtensionApplication接口的接口.

    public
interface IAutoGo { //打開cad的時候會自動執行 void Initialize(); //關閉cad的時候會自動執行 void Terminate(); }

繼承 IExtensionApplication 接口的函數,cad加載這個dll,就會運行它.

    public partial class AutoJJBox : IExtensionApplication
    {
        //為了解決IExtensionApplication在一個dll內無法多次實現接口的關系
        
//所以在這裏反射加載所有的IAutoGo,以達到能分開寫"啟動運行"函數的目的 //打開cad的時候會自動執行 public void Initialize() { RunIAutoGo("Initialize");//方法名字 } //關閉cad的時候會自動執行 public void Terminate() { RunIAutoGo("Terminate");//方法名字 }
private static void RunIAutoGo(string MethodName) { // 通過反射獲取所有繼承了IAutoGo接口的類! // 然後反射實例化,運行它! foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { foreach (Type type in assembly.GetTypes()) { foreach (Type t in type.GetInterfaces())//獲得它的接口集合 { if (t.Name == "IAutoGo")//找到接口的函數 { //再找裏面的Initialize foreach (MemberInfo item in type.GetMembers())//獲得它的成員(函數 方法)的信息集合 { if (item.Name == MethodName) { try { string className = item.ReflectedType.FullName; //類名 string namePace = Assembly.GetExecutingAssembly().ToString(); Type ty = Assembly.Load(namePace).GetType(className); MethodInfo method = ty.GetMethod(MethodName); if (method.IsStatic)//判斷是否靜態方法,不是就要實例化 method.Invoke(null, null); else { //調用實例化方法(非靜態方法)需要創建類型的一個實例 object instanceObject = Activator.CreateInstance(ty); object returnValue1 = method.Invoke(instanceObject, null); //運行所有的 IAutoGo的Initialize!! } } catch (System.Exception E) { throw E; } break; } } } } } } } }

封存上面的,之後也不用動了....

任何需要實現啟動運行的函數,都去實現 : IAutoGo

    public class AutoGo : IAutoGo
    {

        public void Initialize()
        {

            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;//命令欄交互 
            ed.WriteMessage("驚驚博客是 https://www.cnblogs.com/JJBox/ ");
       }

        public void Terminate()
        { }
    }

cad.net IExtensionApplication接口的妙用 驚驚