主函数导出某一程序集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. 全文搜索(AC-1)-互联网信息过载问题

    什么是信息过载? 信息检索技术是什么? 信息过滤技术是什么?

  2. 【ZJOI2017 Round1游记】

    DAY0: 中午12点出发,下午5点到 酒店意外豪华 晚上和MG,LYY们定了个寿司套餐 没什么学习就睡觉了 DAY1: 听说RYZ在ZJ的OIer中影响颇深 讲STL的小哥真是对不住因为我是P党 D ...

  3. Core java for impatient 笔记

    类比c++来学习! 1.在java 中变量不持有对象,变量持有的是对象的引用,可以把变量看做c++中的只能指针,自动管理内存 需要手动初始化(否则就是空指针!) 2.final 相当于c++中的con ...

  4. Journey CodeForces - 839C

    There are n cities and n - 1 roads in the Seven Kingdoms, each road connects two cities and we can r ...

  5. codevs——1009 产生数

    1009 产生数 2002年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给出一个 ...

  6. JVM(四):深入分析Java字节码-下

    JVM(四):深入分析Java字节码-下 在上文中,我们讲解了 Class 文件中的文件标识,常量池等内容.在本文中,我们就详细说一下剩下的指令集内容,阐述其分别代表了什么含义,以及 JVM 团队这样 ...

  7. 解析excel文件并将数据导入到数据库中

    今天领导给安排了一个临时工作,让我将一个excel里面的数据解析后放入数据库中,经过一个下午的努力成功完成,现在将代码献上,希望对大家有所帮助 一.需要导入的jar 1.commons-collect ...

  8. 洛谷 P4057 [Code+#1]晨跑

    P4057 [Code+#1]晨跑 题目描述 “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生 ...

  9. 几点平时不太注意的CSS知识

    1:文本显示的时候,我们发现左右参差不齐,text-align:justify  就能让文本左右都齐刷刷的啦: 2:input标签的内容,处于安全考虑,有时候我们并不希望别人黏贴复制,这时候这样干:& ...

  10. openstack setup demo 前言

    我们搭建一套三节点的openstanck集群.一个controller节点,两个compute节点.操作系统采用Centos7,操作系统版本信息如下. [root@controller01 ~]# c ...