ObjectARX 类与其 .NET 类之间存在一些明显的差异;这些差异需要一些微妙但重要的代码实践更改。 以下各节提供了有关使用托管包装类的一般建议。 内存管理和处置模式C++ 使用析构函数清理资源。ObjectARX 托管包装器实现接口以执行相同的操作。托管包装器派生自公共基类,其用途是管理非托管内存。IDisposableDisposableWrapper 由于 ObjectARX 托管包装器使用的底层资源是非托管类,因此必须主动调用托管包装器。这样做会释放基类型所拥有的资源,一直到层次结构。不要依赖 .NET 垃圾回收来释放非托管资源使用的内存。Dispose 对象标识ObjectARX 托管包装器不保证每次访问 C++ 对象时都会收到相同的 .NET 对象。例如,连续两次打开数据库中的同一对象会生成两个不同的包装器。但是,(ObjectARX 托管包装器的通用基类)会覆盖 和 .Equals 比较基础非托管指针,并返回基础非托管指针。这有效地确保了 .NET 客户端将这两个不同的包装对象视为相同对象。DisposableWrapperEqualsGetHashCodeGetHashCode 错误处理ObjectARX 使用函数的返回值来指示错误条件。在 .NET 中发出信号错误的首选方法是引发异常。ObjectARX 托管包装器将 ObjectARX 错误代码转换为异常。某些错误代码映射到 .NET 本机异常,而其他错误代码则映射到托管包装器公开的自定义异常类型。 获取和设置方法与属性对象属性在 C++ 中建模为 get 和 set 方法。另一方面,.NET 使属性成为执行环境的主要抽象。ObjectARX 托管包装器将 get 和 set 方法相应地映射到 .NET 属性。 反应堆与事件
ObjectARX 使用反应器对事件进行建模。由于 .NET 使事件成为主要抽象,因此 ObjectARX 托管包装器将反应器映射到事件。 非受管反应器需要两个类:事件源类和抽象反应器类。事件源类由系统实例化,并公开 and 函数。客户端从抽象反应器派生一个具体反应器类,实例化具体反应器,并将其添加到事件源中。当事件发生时,事件源调用混凝土反应器中的虚拟函数。addReactor()removeReactor() ObjectARX 托管包装器将反应器模式建模为一个具有托管事件的事件源类。 集合和迭代在 ObjectARX 中,迭代方法不是跨类标准化的。对于托管包装器,两个接口使迭代保持一致。集合实现 .由 implement 返回的迭代器。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 托管包装器中,一个新类封装了此功能。CommandLinePrompt 另一类 ObjectARX 全局函数返回指向实例对象的指针。例如,ObjectARX 用于返回指向 .像这样的函数已映射到 .NET 中的对象属性,因此数据库现在具有一个属性。acdbTransactionManagerPtr()AcDbTransactionManagerTransactionManager |
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-1-7 20:16
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.