本人曾写过“利用C#进行AutoCAD的二次开发”,所采用的是AutoCAD提供的ActiveX接口。但我总觉得它与AutoCAD不能很能好的兼容,现在好了,有了最新的ObjectARX Managed wrapper classes(呵呵,就是专门为.NET量身定做的用于AutoCAD的二次开发)。从现在开始,广大.NET程序员就可以不必羡慕ObjectARX的强大功能,不需要再使用学起来比较难的C++了,只要用自己喜欢的C#或VB.NET就可以进行AutoCAD的二次开发了。
好了,闲话少说,现在进入正题,我这次翻译的是ObjectARX Managed wrapper classes的中文参考。
ObjectARX托管封装类(ObjectARX Managed Wrapper Classes)
ObjectARX®提供了托管封装类(managed wrapper classes)来使程序员能使用Microsoft .NET Framework并利用VB .NET 和 C#等.NET语言来进行编程。你可以通过查看ObjectARX帮助文件的托管封装类(managed wrapper classes)部分来获取托管封装类(managed wrapper classes)的详细列表。要了解.NET Framework的相关信息,请查看Microsoft的有关文档。
这一章假定你对ObjectARX和AutoCAD® 数据库有所了解。
ObjectARX托管封装类(the ObjectARX Managed Wrapper Classes)概览
托管封装类(managed wrapper classes)由ObjectARX SDK提供,它使你能够利用任何一种Microsoft .NET Framework所支持的语言来进行编程。托管类主要的功能与数据库有关,它可以用来编制读写DWG文件的应用程序。
你可以通过查看ObjectARX帮助文件的托管封装类(managed wrapper classes)部分来获取托管封装类(managed wrapper classes)的详细列表。
ObjectARX托管封装类(the ObjectARX Managed Wrapper Classes)存放在下面两个组件中:
- acdbmgd.dll 包含ObjectDBX API。这个dll是ObjectDBX SDK 的一部分,随AutoCAD 一起发售。
- acmgd.dll包含AutoCAD API。这个dll随AutoCAD 一起发售。
C++和ObjectARX中定义的数据类型在.net中有相应的部分。例如,C++中的Bool型在.net中是System::Boolean,而ObjectARX中的Adesk::Boolean在.net中是System::Bool。
ObjectARX类和托管封装类(managed wrapper classes)是相对应的。下表显示了ObjectARX类和.net命名空间(namespace)的映射关系:
ObjectARX类 .net命名空间
AcDb Autodesk.AutoCAD.DatabaseServices
AcRx Autodesk.AutoCAD.Runtime
AcEd Autodesk.AutoCAD.ApplicationServices
AcUt Autodesk.AutoCAD.DatabaseServices,
Autodesk.AutoCAD.ApplicationServices
AcCm Autodesk.AutoCAD.Colors
AcGe Autodesk.AutoCAD.Geometry
AcGi Autodesk.AutoCAD.GraphicsInterface
AcLy Autodesk.AutoCAD.LayerManager
AcPl Autodesk.AutoCAD.PlottingServices
C++和.NET的编程差异
下面的主题讨论ObjectARX类和对应的.NET部分之间的不同,并对托管封装类(managed wrapper classes)的使用提出一些有用的建议。
这一部分的主题:
内存管理和回收模式
C++使用销毁器来清理资源。ObjectARX托管封装类以实现IDisposable接口来做同样的事情。托管封装类派生于通用基础类DisposableWrapper,DisposableWrapper的作用是来管理非托管内存。
由于被ObjectARX托管封装类使用的内在资源是非托管类,因此你必须明确调用托管封装类的销毁器函数Dispose。这样可以释放所有继承的基类所拥有的资源。不要指望.NET垃圾搜集器来回收被非托管资源所占用的内存。
对象的唯一性
ObjectARX托管封装类不能保证你每次访问一个C++对象时得同一个.NET对象。例如,连续打开数据库中的同一个对象两次将会产生两个不同的.NET对象。但是,通用基础类DisposableWrapper重载了Equals和GetHashCode方法。Equals比较内在的非托管指针,而GetHashCode返回内在的非托管指针。这一点保证了.NET客户端可以把这两个不同的托管封装对象视为同一个。
错误处理
ObjectARX利用函数的返回值来表示不同的错误情况。在.NET中标识错误的比较好的方法是产生一个异常(exception)。ObjectARX托管封装类用异常来表示ObjectARX错误代码。一些错误代码和.NET本身的异常相对应,而其他的错误代码和ObjectARX托管封装类提供的通用异常类相对应。
Get和Set方法与属性
在C++中对象的属性被封装为Get和Set方法。而.NET则使用属性。ObjectARX托管封装类的属性与Get和Set方法相对应。
反应器与事件
ObjectARX使用反应器来封装事件。因为.NET使用事件,所以ObjectARX托管封装类的事件与反应器相对应。
非托管反应器需要两个类:事件源类和抽象反应器类。事件源类由系统实例化,并提供addReactor()和removeReactor()函数。客户端从抽象反应器得到一个具体的反应器类,并实例化这个具体的反应器,然后把它加入事件源。当事件发生时,事件源调用具体的反应器中的虚函数。
ObjectARX托管封装类把反应器模式封装成一个带有托管事件的事件源类。
集合和遍历
在ObjectARX中,遍历在类中没有被标准化。而对于托管封装类来说,两个接口使遍历能够进行。集合实现了IEnumerable接口。由GetEnumerator方法返回的Iterators实现了IEnumerator接口。
注册命令
ObjectARX允许扩展应用程序在AutoCAD中注册命令。这个注册是隐含的:应用程序运行时必须找到它想注册的命令。
.NET让应用程序使用声明的形式来定义程序的行为。ObjectARX托管封装类使用声明的形式来注册命令。通用属性被用来指明命令。请参阅“在托管程序中定义AutoCAD命令”这一部分来看具体的代码和详细的信息。
全局函数
ObjectARX托管封装类中没有全局函数,所以许多ObjectARX全局函数被映射成新的.NET对象或已存在的.NET对象的属性。
例如,在程序中用于和AutoCAD命令行提示相交互的ObjectARX全局函数,在ObjectARX托管封装类中使用一个新的CommandLinePrompt类进行这一类封装。
另一类ObjectARX全局函数返回实例对象的指针。例如,ObjectARX使用acdbTransactionManagerPtr()函数为返回AcDbTransactionManager的指针。像这一类函数在.NET中已被映射成对象的属性,所以数据库有一个TransactionManager属性。
|