CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

C++ 和 .NET 之间的编程差异 (.NET)

2023-1-1 18:02| 发布者: admin| 查看: 878| 评论: 0|来自: AutoCAD

摘要: ObjectARX 类与其 .NET 类之间存在一些明显的差异;这些差异需要一些微妙但重要的代码实践更改。

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


路过

雷人

握手

鲜花

鸡蛋

最新评论

2024年新出cad图库素材

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-5-7 04:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部