主函数导出某一程序集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. 九度oj 题目1060:完数VS盈数

    题目1060:完数VS盈数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6461 解决:2426 题目描述: 一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1.则称其 ...

  2. 关于iphone 微信浏览器编码问题

    这个问题最终没有完美的解决,给出的一个解决方法是返回一个html文档.

  3. noip模拟赛 卖书

    分析:模拟题,只是有几个地方需要注意一下:第一个人必须支付5元,找零15元可以找一张10元一张5元,也可以找3张5元. #include <cstdio> #include <cst ...

  4. 前端开发:JQuery(2)& Bootstrap

    JS事件流 事件的概念:HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件. 事件流: ...

  5. android开发里跳过的坑——调用已安装视频播放器在有些机器上无效

    调用已安装视频播放器播放未修改之前的代码 private void startPlay(String fileName){ File file = new File(fileName); Intent ...

  6. poj——2367  Genealogical tree

    Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6025   Accepted: 3969 ...

  7. Ubuntu 16.04下减小/释放/清理VirtualBox虚拟硬盘文件的大小

    一般在VirtualBox中安装Windows,然后用无缝模式进行某些特定软件的使用. 而VirtualBox的虚拟硬盘会越用越大,并且VirtualBox没有自带清理工具,相比VMware来说,VM ...

  8. 将mysql数据库数据导出为.sql文件

    打开Navicat ,在我们要到处的数据上面右击鼠标,然后弹出的快捷菜单上点击“转储SQL 文件”,在再次弹出的子菜单项中选择第一个“数据跟结构”.

  9. Linux下搭建maven私服Nexus 3.2.1-01

    1. 私服介绍私服是指私有服务器,是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构建.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则, ...

  10. C#代码读写XML

    <1> 创建XML文档 using System; using System.Collections.Generic; using System.Linq; using System.Te ...