主函数导出某一程序集AutoCAD 注册命令

/// <summary>
///提取所有的命令
/// </summary>
/// <param name="dllFiles">dll的路径</param>
/// <returns></returns>
public static List<gcadDllcmd> GetDllCmds(params string[] dllFiles)
{
List<gcadDllcmd> res = new List<gcadDllcmd>();
List<gcadCmds> cmds = new List<gcadCmds>();
#region 提取所以的命令
for (int i = 0; i < dllFiles.Length; i++)
{
Assembly ass = Assembly.LoadFile(dllFiles[i]);//反射加载dll程序集
var clsCollection = ass.GetTypes().Where(t => t.IsClass && t.IsPublic).ToList();
if (clsCollection.Count > 0)
{
foreach (var cls in clsCollection)
{
var methods = cls.GetMethods().Where(m => m.IsPublic && m.GetCustomAttributes(true).Length > 0).ToList();
if (methods.Count > 0)
{
foreach (MethodInfo mi in methods)
{
var atts = mi.GetCustomAttributes(true).Where(c => c is CommandMethodAttribute).ToList();
if (atts.Count == 1)
{
gcadCmds cmd = new gcadCmds(cls.Name, mi.Name, (atts[0] as CommandMethodAttribute).GlobalName, ass.ManifestModule.Name.Substring(0, ass.ManifestModule.Name.Length - 4));
cmds.Add(cmd);
}
}
}
}
} }
#endregion
if (cmds.Count > 0)
{
List<string> dllName = new List<string>();
foreach (var item in cmds)
{
if (!dllName.Contains(item.dllName)) dllName.Add(item.dllName);
}
foreach (var item in dllName) res.Add(new gcadDllcmd(item, cmds));
}
return res;
//
}

1# 定义自定义的class,

/// <summary>
/// 储存自定义的cad命令的信息的类
/// </summary>
public class gcadCmds
{
public string clsName { get; set; }
public string cmdName { get; set; }
public string cmdMacro { get; set; }
public string dllName { get; set; } public gcadCmds(string _clsName, string _cmdName, string _macro, string _dllName)
{
this.dllName = _dllName;
this.clsName = _clsName;
this.cmdMacro = _macro;
this.cmdName = _cmdName;
} }

2# 定义类

/// <summary>
/// 储存包含自定命令的类
/// </summary>
public class gcadClscmd
{
public string clsName { get; set; } public string dllName { get; set; } public bool HasGcadcmds { get; set; } public List<gcadCmds> curClscmds { get; set; } public gcadClscmd(string _clsName, List<gcadCmds> cmds)
{
this.clsName = _clsName;
this.dllName = cmds.First().dllName;
var clsCmds = cmds.Where(c => c.clsName == this.clsName).ToList();
if (clsCmds.Count > 0)
{
this.HasGcadcmds = true;
this.curClscmds = new List<gcadCmds>();
foreach (var item in clsCmds)
{
if (item.clsName == this.clsName) this.curClscmds.Add(item);
} }
else this.HasGcadcmds = false;
}
}

3# 存储每个dll的

/// <summary>
/// 储存每个dll类的
/// </summary>
public class gcadDllcmd
{
public string DllName { get; set; }
public bool HasGcadcls { get; set; }
public List<gcadClscmd> clsCmds { get; set; }
public List<gcadCmds> curDllcmds { get; set; }
public gcadDllcmd(string _dllname, List<gcadCmds> cmds)
{
this.DllName = _dllname;
var curDllcmds = cmds.Where(c => c.dllName == this.DllName).ToList();
if (curDllcmds.Count > 0)
{
this.HasGcadcls = true;
this.curDllcmds = curDllcmds;
List<string> listClsName = new List<string>();
foreach (gcadCmds item in this.curDllcmds)
{
if (!listClsName.Contains(item.clsName)) listClsName.Add(item.clsName);
}
this.clsCmds = new List<gcadClscmd>();
foreach (var item in listClsName)
{
gcadClscmd clsCmds = new gcadClscmd(item, this.curDllcmds.Where(c => c.clsName == item).ToList());
this.clsCmds.Add(clsCmds);
} }
else this.HasGcadcls = false;
} }

AutoCAD C# 利用反射导出所注册的命令的更多相关文章

  1. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  2. 第十篇 一个利用反射实现的Excel导出

    前些天写了个导出Excel的公共类,因为项目中也需要上传Excel,没有利用Office组件,(PS:Office在上传文件时候,Excel进程无法关闭,会导致上传和打开失败)有的说利用Kill把进程 ...

  3. struts2中利用POI导出Excel文档并下载

    1.项目组负责人让我实现这个接口,因为以前做过类似的,中间并没有遇到什么太困难的事情.其他不说,先上代码: package com.tydic.eshop.action.feedback; impor ...

  4. 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)

    试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...

  5. C# winform利用反射和自定义特性加载功能模块(插件式开发)

    由于在实际的工作中, 碰见这样的一个问题: 一个软件, 销售给A客户 他需要所有功能, 但是销售给B客户, 他只需要其中的一部分, 1.如果我们在实际的开发过程中, 没有把一些功能模块区分开来的话, ...

  6. 【转】利用反射快速给Model实体赋值

    原文地址:http://blog.csdn.net/gxiangzi/article/details/8629064 试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有 ...

  7. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

  8. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  9. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

随机推荐

  1. POJ2632 Crashing Robots 解题报告

    Description In a modernized warehouse, robots are used to fetch the goods. Careful planning is neede ...

  2. JVM(三):深入分析Java字节码-上

    JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...

  3. Mybatis教程(一)

    1      Mybatis教程(一) 学习过的持久层框架:DBUtils , Hibernate Mybatis就是类似于hibernate的orm持久层框架. 为什么学Mybatis? 目前最主流 ...

  4. MySQL查询去重语句

    1.distinct select count(distinct CName) from Course select count(CName) from (select distinct CName ...

  5. HAProxy教程收集

    市面上HA的教程不是很多,基本都是基于LVS+HA实践的打包资料. 要最权威的文档应该去官方. 官方文档入口: http://www.haproxy.org/#docs 中文文档收集: http:// ...

  6. apple applessd.sys error

    http://bbs.feng.com/read-htm-tid-10242622.html

  7. 看我如何基于Python&Facepp打造智能监控系统

    由于种种原因,最近想亲自做一个基于python&facepp打造的智能监控系统. 0×00:萌芽 1:暑假在家很无聊 想出去玩,找不到人.玩个lol(已卸载),老是坑人.实在是无聊至极,不过, ...

  8. 1.Urllib2模块使用

    网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. Urllib2介绍: urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用) urllib2 官方文 ...

  9. CCBPM工作流引擎的消息机制与设计

    keyword:ccflowjflow 消息机制流程引擎 自己主动发送短信 发送邮件 发送消息 流程引擎微信连接 消息接口 关于ccbpm: 我们把ccflow jflow两个版本号的工作流引擎统称为 ...

  10. 网络学习笔记:TCP/IP连网和Internet

    1.网关 由硬件和软件组成,实现不同网段间的数据传送. 常用路由器充当网关. 网关通常维护一份路由表,但只有少量的编址信息.它用这些信息把数据转发到知道更多信息的网关. 组成互联网骨干的网关称为核心网 ...