找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1661|回复: 0

[分享] AutoCAD初始化C#程序中的属性相关

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-18 05:55:37 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
(原创)AutoCAD初始化C#程序中的属性相关
卡卡尼莫!关注
阅读:12392010-10-04 15:10
标签:杂谈
1.关于CAD初始化托管程序,先看一段帮助中文件:
当AutoCAD装载一个托管程序时,它查询程序的装配件(assembly)是否有ExtensionApplication自定义特性性。如果它找到这个特性,AutoCAD把这个特性所联系的类型作为程序的入口点。如果没有找到这个特性,AutoCAD查找所有实现IExtensionApplication接口的输出类。如果没有找到相关的接口实现,AutoCAD就会跳过程序的初始化步骤。
ExtensionApplication 特性只能被附加到一个类型。这个被附加的类型必须实现IExtensionApplication接口。
除了查找IExtensionApplication 接口的实现,AutoCAD 查询程序的装配件是否有一个或多个CommandClass特性。如果找到带有这个特性的实例,AutoCAD 只查找它们所联系的命令方法类型。否则,它会查找所有输出的类型。
CommandClass 特性可以被声明为定义AutoCAD命令处理函数的任何类型。如果一个程序使用CommandClass 属性,它必须为包含有AutoCAD命令处理函数的所有类型声明一个带有此特性的实例。
下面描述了怎样使用这些特性:
2.优化代码来快速载入大型程序
1.定义一个实现Autodesk.AutoCAD.Runtime.IExtensionApplication接口的类型。如果你不需要执行初始化或终止工作,那么可以为接口方法提供空实现。
2.在装配件环境中,声明一个ExtensionApplication特性。
3.把实现了IExtensionApplication接口的类型传递给ExtensionApplication特性。
4.在装配件环境中,为每个定义AutoCAD命令方法的类声明一个CommandClass特性。
5.把命令方法类的类型传递给CommandClass特性。
3.代码分析
using System;
using System.Diagnostics;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
[assembly: ExtensionApplication(typeof(ManagedApp.Init))]
[assembly: CommandClass(typeof(ManagedApp.Commands))]
namespace ManagedApp
{
public class Init : IExtensionApplication
{
public void Initialize()
{
。。。。。。
}
[CommandMethod('Test')]
public void Test()
{
。。。。。。
}
}
public class Commands
{
[CommandMethod('kaka',CommandFlags.Modal)]
public void LoadAssembly()
{
。。。。。。
}
[CommandMethod('GetVersion')]
public void GetVersion()
{
。。。。。。
}
}
}
1. Assembly:assembly标识符显式地告诉了编译器,当前这个属性用于整个程序集,所以它的位置不能在arxClass类中,可以放在namespace ClassLibrary中或者外面。上面是放在了命名空间外面。
2.[assembly: ExtensionApplication(typeof(ManagedApp.Init))]
上面表示ExtensionApplication属性,CAD首先查找它标志的类来初始化,如果没有找到,就找如上面public class Init : IExtensionApplication 实现了IExtensionApplication的类,如果还是没有找到,就跳过初始化。所以上面[assembly: ExtensionApplication(typeof(ManagedApp.Init))]和public class Init : IExtensionApplication后面的IExtensionApplication写上一处就可以了。
3.[assembly: CommandClass(typeof(ManagedApp.Commands))]
表示ManagedApp.Commands是定义CommandClass的,就是说能够执行Commands中定义的命令(CommandMethod)如上面的[CommandMethod('kaka')]和[CommandMethod('GetVersion')],但是不能执行[CommandMethod('Test')],因为[CommandMethod('Test')]所在的类Initialize()没有定义CommandClass
4. 在属性类名与后缀Attribute间存在一个自动的编译转换。因此当我们用一个属性去修饰一个程序实体时,不需要给出Attribute这个后缀。编译器首先会在System.Attribute的所有派生类中进行匹配,如果没有找到匹配属性,它就将属性名加上Attribute后缀名后再进行匹配。
所以上面使用[CommandMethod('kaka')]和[]CommandMethodAttribute('kaka')效果是一样的。
X

5.从对象浏览器中可以看到有两



http://blog.sina.cn/dpool/blog/s/blog_69e8fdf00100m2p0.html?





论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-1-6 01:16 , Processed in 0.387526 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表