ObjectARX 类与其 .NET 类之间存在一些明显的差异;这些差异需要一些微妙但重要的代码实践更改。 以下各节提供了使用托管包装类的一般建议。 内存管理和释放模式C++使用析构函数来清理资源。ObjectARX 托管包装器实现接口来执行相同的操作。托管包装派生自公共基类,其用途是管理非托管内存。IDisposableDisposableWrapper 由于 ObjectARX 托管包装器使用的基础资源是非托管类,因此必须主动调用托管包装器。这样做会释放基类型拥有的资源,一直沿层次结构向上。不要依赖 .NET 垃圾回收来释放非托管资源使用的内存。Dispose 对象标识ObjectARX 托管包装器不保证每次访问C++对象时都收到相同的 .NET 对象。例如,连续两次打开数据库中的同一对象会产生两个不同的包装器。但是,(ObjectARX 托管包装器的公共基类)覆盖沙子。等于比较基础非托管指针,并返回基础非托管指针。这有效地确保 .NET 客户端将这两个不同的包装对象视为相同。DisposableWrapperEqualsGetHashCodeGetHashCode 错误处理ObjectARX 使用函数的返回值来指示错误条件。在 .NET 中发出错误信号的首选方法是引发异常。ObjectARX 托管包装器将 ObjectARX 错误代码转换为异常。某些错误代码映射到 .NET 本机异常,而其他错误代码映射到托管包装器公开的自定义异常类型。 获取和设置方法与属性对象属性在C++中建模为 get 和 set 方法。另一方面,.NET 使属性成为执行环境的主要抽象。ObjectARX 托管包装器将获取方法和设置方法相应地映射到 .NET 属性。 反应堆与事件
ObjectARX 使用反应器对事件进行建模。由于 .NET 使事件成为主要抽象,因此 ObjectARX 托管包装器将反应器映射到事件。 非托管反应器需要两个类:事件源类和抽象反应器类。事件源类由系统实例化并公开 theandfunctions。客户端从抽象反应器派生一个混凝土反应器类,实例化混凝土反应器,并将其添加到事件源。事件发生时,事件源调用混凝土反应器中的虚函数。addReactor()removeReactor() ObjectARX 托管包装器将反应器模式建模为具有托管事件的一个事件源类。 集合和迭代在 ObjectARX 中,迭代方法不是跨类标准化的。对于托管包装器,两个接口使迭代保持一致。集合实现。由实现返回的迭代器。IEnumerableGetEnumeratorIEnumerator 如果在动态对象上显式调用方法,则需要显式释放它。请参阅示例代码:GetEnumerator Database db = HostApplicationServices.WorkingDatabase; dynamic dynamicDb = HostApplicationServices.WorkingDatabase; var lineTypeTable = dynamicDb.LinetypeTableId; var stEnumerator = lineTypeTable.GetEnumerator(); stEnumerator.Dispose(); 命令注册ObjectARX 允许扩展应用程序向 AutoCAD 注册命令。此注册是隐式的:必须运行应用程序以找出要注册的命令。 .NET 鼓励应用程序使用声明性样式来定义其行为。ObjectARX 托管包装器使命令注册具有声明性。自定义属性用于表示命令方法。有关代码示例和详细信息,请参阅命令定义 (.NET)。 全局函数全局函数在 ObjectARX 托管包装器中不存在,因此许多 ObjectARX 全局函数映射到新的 .NET 对象或现有对象上的新属性。 例如,应用程序使用一组 ObjectARX 全局函数与 AutoCAD 命令提示符进行交互。在 ObjectARX 托管包装器中,newclass 封装了此功能。CommandLinePrompt 另一类 ObjectARX 全局函数返回指向实例对象的指针。例如,ObjectARX 用于返回指向的指针。此类函数已映射到 .NET 中的对象属性,因此数据库现在具有 aproperty。acdbTransactionManagerPtr()AcDbTransactionManagerTransactionManager |
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )
GMT+8, 2024-5-7 04:49
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.