雪山飞狐_lzh 发表于 2009-8-25 13:34:00

.Net程序自动加载管理器

本帖最后由 作者 于 2009-9-3 9:38:17 编辑


2009/9/3
Ver1.0(.Net Framework 2.0)
1、初始化文件更改为读写注册表
2、加入重新载入功能,以防注册表信息误删除
3、双击可运行命令(测试功能)
2009/8/30
放弃运行命令的功能,没有实用价值
界面基本完善,添加程序集启动方式的选择
2009/8/29
1、命令文件改用二进制文件存储
2、提供简化的通讯录管理程序测试
3、注意,程序初次运行应将Assx文件删除
4、去除一些Bug
2009/8/28
1、归并数据文件
2、去除Ass文件的多余属性
2009/8/27试用版本
功能改进:
1、完善管理界面
2、加入被管理程序的命令帮助的功能
3、管理界面添加程序时,直接导入程序
注意,程序运行过程中会在被管理文件的同目录生成一些ass/assx/cmds文件,请勿删
正式版本会把这些文件归并到同一目录
后期考虑直接从界面运行命令
简化的版本,开源:)

运行效果:
1、第一次netload加载该程序加载自定义文件成功。自定义组: ACAD
加载自定义文件成功。自定义组: CUSTOM
加载自定义文件成功。自定义组: EXPRESS
正在重生成模型。

AutoCAD Express Tools Copyright ?2002-2004 Autodesk, Inc.

AutoCAD 菜单实用程序已加载。
命令: COMMANDLINE

命令: netload

NetAutoLoad 已加载!

检查注册表......
未发现NetAutoLoad的自动加载项,重新载入......
自动加载项设置成功!

检查序列化文件......OK!

检查注册表加载项......
TlsCad(TlsCad 0.2 For AutoCad)未正确注册!......OK!

TlsCad Load!

TlsAddressList(TlsAddressList 1.0 For AutoCad)未正确注册!......OK!
2、以后运行,程序及被管理项会在AutoCad启动时加载加载自定义文件成功。自定义组: ACAD
加载自定义文件成功。自定义组: CUSTOM
加载自定义文件成功。自定义组: EXPRESS
正在重生成模型。

NetAutoLoad 已加载!

检查注册表......OK!

检查序列化文件......OK!

检查注册表加载项......
TlsCad(TlsCad 0.2 For AutoCad)已注册!
TlsAddressList(TlsAddressList 1.0 For AutoCad)已注册!


TlsCad Load!

AutoCAD Express Tools Copyright ?2002-2004 Autodesk, Inc.

AutoCAD 菜单实用程序已加载。
命令: COMMANDLINE
3、后期将加入管理界面,简化序列化文件的输入,可能加入被管理程序的命令帮助的功能:)

664571221 发表于 2018-8-13 20:54:52

你好如何使用工具

雪山飞狐_lzh 发表于 2009-8-25 13:35:00

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using System.Collections;
using Microsoft.Win32;

using Autodesk.AutoCAD.DatabaseServices;

namespace TlsCad.NetAutoLoad
{
   
    public class Module
    {
        public string Name;
        public string Location;
        public bool Load;
        public long Loadctrls;
        public string Description;

        private static List<string> _regApps;

        public Module() { }

        public Module(string name, string location, bool load,int loadctrls, string description)
        {
            Name = name;
            Location = location;
            Load = load;
            Loadctrls = loadctrls;
            Description = description;
        }

        public bool SearchForReg()
        {
            if (_regApps == null)
            {
                RegistryKey appkey = GetAcAppKey(false);
                _regApps = new List<string>(appkey.GetSubKeyNames());
                appkey.Close();
            }

            return _regApps.Contains(Name);

        }

        public void RegApp()
        {
            RegistryKey appkey = GetAcAppKey(true);
            RegistryKey rk = appkey.CreateSubKey(Name);
            rk.SetValue("DESCRIPTION", Name, RegistryValueKind.String);
            rk.SetValue("LOADCTRLS", Loadctrls, RegistryValueKind.DWord);
            rk.SetValue("LOADER", Location, RegistryValueKind.String);
            rk.SetValue("MANAGED", 1, RegistryValueKind.DWord);
            appkey.Close();
        }

        private RegistryKey GetAcAppKey(bool writable)
        {

            RegistryKey ackey =
                Registry.CurrentUser.OpenSubKey(
                    HostApplicationServices.Current.RegistryProductRootKey);

            return ackey.OpenSubKey("Applications", writable);

        }

    }

    public class ModuleCollection : ICollection
    {

        private List<Module> lst = new List<Module>();

        public Module this
        {
            get { return (Module)lst; }
        }

        public void Add(Module mod)
        {
            lst.Add(mod);
        }

        public void Remove(Module mod)
        {
            lst.Remove(mod);
        }

        public void WriteXml(string path)
        {
            try
            {

                XmlSerializer xs = new XmlSerializer(typeof(ModuleCollection));
                StreamWriter sw = new StreamWriter(path);
                xs.Serialize(sw, this);
                sw.Close();
            }
            catch
            { }
        }

        public void ReadXml(string path)
        {
            try
            {
                XmlSerializer xs = new XmlSerializer(typeof(Module[]));
                StreamReader sr = new StreamReader(path);
                Module[] ps = ((Module[])xs.Deserialize(sr));
                sr.Close();
                for (int i = 0; i < ps.Length; Add(ps)) ;
            }
            catch
            { }
        }

        #region ICollection 成员

        public void CopyTo(Array array, int index)
        {
            lst.CopyTo((Module[])array, index);
        }

        public int Count
        {
            get { return lst.Count; }
        }

        public bool IsSynchronized
        {
            get { return false; }
        }

        public object SyncRoot
        {
            get { return this; }
        }

        #endregion

        #region IEnumerable 成员

        public IEnumerator GetEnumerator()
        {
            return lst.GetEnumerator();
        }

        #endregion
    }
}

雪山飞狐_lzh 发表于 2009-8-25 13:35:00

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace TlsCad.NetAutoLoad
{
    class MyArx
    {

        public static Assembly CurAssembly
        {
            get { return (new MyArx()).GetType().Assembly; }
        }

        public static string Location
        {
            get { return CurAssembly.Location; }
        }

        public static string MainPath
        {
            get
            {
                string s = Location;
                return s.Substring(0, s.LastIndexOf("\\"));
            }
        }
    }
}

雪山飞狐_lzh 发表于 2009-8-25 13:36:00

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;

using Microsoft.Win32;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;



namespace TlsCad.NetAutoLoad
{
    public class TlsApplication : IExtensionApplication
    {
        #region IExtensionApplication 成员

        private static ModuleCollection _modules = new ModuleCollection();

        public void Initialize()
        {

            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ed.WriteMessage("\nNetAutoLoad 已加载!");

            //查找注册表键值
            ed.WriteMessage("\n\n检查注册表......");

            Module module = new Module(
                "NetAutoLoad",
                MyArx.Location,
                false,
                2,
                "NetApi Manger For AutoCad");

            if (module.SearchForReg())
            {
                ed.WriteMessage("OK!");
            }
            else
            {
                ed.WriteMessage("\n未发现NetAutoLoad的自动加载项,重新载入......");
                module.RegApp();
                ed.WriteMessage("\n自动加载项设置成功!");
            }

            DirectoryInfo di = new DirectoryInfo(MyArx.MainPath);

            //查找序列化文件
            ed.WriteMessage("\n\n检查序列化文件......");
            if (di.GetFiles("NetAutoLoad.xml").Length == 0)
            {
                ed.WriteMessage("\n未发现序列化文件,重新生成......");
                ModuleCollection modules = new ModuleCollection();
                modules.Add(module);
                modules.WriteXml(MyArx.MainPath + "\\NetAutoLoad.xml");
                ed.WriteMessage("OK!");
            }
            else
            {
                ed.WriteMessage("OK!");
            }

            //检查加载项
            ed.WriteMessage("\n\n检查注册表加载项......");
            _modules.ReadXml(MyArx.MainPath + "\\NetAutoLoad.xml");
            foreach (Module mod in _modules)
            {
                if (mod.Load)
                {
                    if (!mod.SearchForReg())
                    {
                        ed.WriteMessage("\n{0}({1})未正确注册!......", mod.Name, mod.Description);
                        mod.RegApp();
                        ed.WriteMessage("OK!");
                        Assembly.LoadFrom(mod.Location);
                    }
                    else
                    {
                        ed.WriteMessage("\n{0}({1})已注册!", mod.Name, mod.Description);
                    }
                }
            }
            ed.WriteMessage("\n");
        }

        public void Terminate()
        {

        }

        #endregion

    }

}

雪山飞狐_lzh 发表于 2009-8-26 15:24:00

本帖最后由 作者 于 2009-8-27 23:16:55 编辑

命令: nal:c
++++++++++++++++++++++++++++++++++++
程序集名称:NetAutoLoad
路径:D:\TlsCad\Bin\NetAutoLoad.dll
说明:
    .Net Assembly Manger For AutoCad
    Writer:xsfhlzh
    How to:
    1.第一次运行时,命令行加载;
    2.下次运行时程序将自动加载.
    命令名:Nal:C,Nal:C
      函数名:ShowCmds
    命令名:Nal:M,Nal:M
      函数名:Mange
    命令名:Nal:U,Nal:U
      函数名:UnReg
++++++++++++++++++++++++++++++++++++
程序集名称:TlsCad
路径:D:\TlsCad\Bin\TlsCad.dll
说明:
    TlsCad 0.2 For AutoCad
    Writer:xsfhlzh
    命令名:CCicByDb,CCicByDb
      函数名:CCicByDb
    命令名:CCirByGe,CCirByGe
      函数名:CCirByGe
    命令名:CTest,CTest
      函数名:test
    命令名:ee,ee
      函数名:RussiaSquareEnd
    命令名:ht,ht
      函数名:HatchLoop
    命令名:lj,lj
      函数名:DoIt
    命令名:plj,plj
      函数名:DoIt
    命令名:ss,ss
      函数名:RussiaSquareStart
    命令名:t1,t1
      函数名:Test1
    命令名:t2,t2
      函数名:Test2
    命令名:t3,t3
      函数名:Test3
    命令名:t4,t4
      函数名:Test4
    命令名:t5,t5
      函数名:Test5
    命令名:t8,t8
      函数名:Test8
    命令名:t9,t9
      函数名:Test9
    命令名:Tls:BAC,Tls:BAC
      函数名:BreakAllCurve
    命令名:Tls:DP,Tls:DP
      函数名:DisplayProperties
    命令名:Tls:PI,Tls:PI
      函数名:PartInsert
    命令名:Tls:PP,Tls:PP
      函数名:Test3
    命令名:TT,TT
      函数名:Test

雪山飞狐_lzh 发表于 2009-8-30 10:30:00

本帖最后由 作者 于 2009-8-30 10:51:29 编辑

命令: nal:c
NetAutoLoad 已加载!
检查注册表......OK!
检查初始化文件......OK!
检查注册表加载项......
--------------------------------------
NetAutoLoad已注册!
      "D:\TlsCad\Bin\NetAutoLoad.dll"
--------------------------------------
TlsAddressList已注册!
      "D:\TlsCad\Bin\TlsAddressList.dll"
--------------------------------------
TlsBasal已注册!
      "D:\TlsCad\Bin\TlsBasal.dll"
--------------------------------------
++++++++++++++++++++++++++++++++++++
程序集名称:NetAutoLoad
路径:D:\TlsCad\Bin\NetAutoLoad.dll
说明:
    .Net Assembly Manger For AutoCad
    Writer:xsfhlzh
    How to:
    1.第一次运行时,用NetLoad命令加载;
    2.下次运行时程序将自动加载.
    注意:
    1.Ass是命令列表文件,包含程序说明和命令说明,可覆盖.
    2.Assx文件是程序初始化文件,包含程序列表,不可覆盖.
    3.添加程序集不要在Assx文件中手动加载,必要时可删除该文件.
    ****************************
    命令名:Nal:C,Nal:C
      模块名:NetAutoLoad.dll
      类型名:TlsCad.NetAutoLoad.TlsMain
      函数名:ShowCmds
      说明:
      命令行显示命令列表
    ****************************
    命令名:Nal:M,Nal:M
      模块名:NetAutoLoad.dll
      类型名:TlsCad.NetAutoLoad.TlsMain
      函数名:Mange
      说明:
      1.添加/删除程序集
      2.设置程序集启动方式
      3.为命令添加帮助
    ****************************
    命令名:Nal:U,Nal:U
      模块名:NetAutoLoad.dll
      类型名:TlsCad.NetAutoLoad.TlsMain
      函数名:UnReg
      说明:
      程序卸载
    ****************************
++++++++++++++++++++++++++++++++++++
程序集名称:TlsAddressList
路径:D:\TlsCad\Bin\TlsAddressList.dll
说明:
    TlsAddressList For AutoCad
    Writer:xsfhlzh
    通讯录管理
    ****************************
    命令名:tls:als,tls:als
      模块名:TlsAddressList.dll
      类型名:TlsAddressList.TlsMain
      函数名:ShowAddressList
      说明:
      显示通讯录管理界面
    ****************************
++++++++++++++++++++++++++++++++++++
程序集名称:TlsBasal
路径:D:\TlsCad\Bin\TlsBasal.dll
说明:
    TlsBasal For AutoCad
    Writer:xsfhlzh
    TlsCad基本类库
    ****************************
++++++++++++++++++++++++++++++++++++

雪山飞狐_lzh 发表于 2009-9-3 09:47:00

<p>1.0正式版本,短时间内应该不会更新了:)</p>

游天居士 发表于 2009-12-26 15:35:00

收到顶起来。

sn_wanglei 发表于 2009-12-27 12:21:00

<p>顶起来</p><p></p>

vvc221 发表于 2010-4-15 09:55:00

強大.
页: [1] 2
查看完整版本: .Net程序自动加载管理器