.net - 使用 C++/CLI 包装非托管 C++ 类库 - 问题 2 - 集合

标签 .net visual-c++ collections c++-cli wrapper

注:这篇文章代表了我询问的问题 #2。在两个问题中重复介绍部分(所有文本,直到达到数字),因为它是回答问题可能需要的背景信息。

问题简介

我有一个非托管 C++ 库,其中包含几个“更高级别”库共有的类和函数。我现在需要为 C#/.Net 应用程序提供对公共(public)库的访问权限。为此,我必须使用 C++/CLI 包装类来包装公共(public)库。

公共(public)库中包含的类可以是包含嵌套类定义和成员变量的复杂类,这些成员变量是其他类对象的集合。集合变量是用于管理集合的自定义列表类的 typedef 实例。公共(public)库还包括表示使用 FLEX/BISON 创建的自定义脚本文件语法的解析结构的类。公共(public)库和“更高级别”库都以允许跨平台(Linux 和 GCC)编译和使用的方式编写。我所做的任何更改都必须允许这一点。

C++/CLI 包装类最初只需要读取能力。但随着项目的推进,我最终也需要能够创建和修改对象。

我了解 C++/CLI,并为其他非托管 C/C++ 项目创建了几个包装器,并为同一个公共(public)库提供了抽象功能。所以我已经有了基础知识(和一些高级知识)。

我有两个与执行此任务相关的问题,因为它们都可以产生自己的讨论和解决方案,所以我将我的问题分成单独的帖子。我将在每篇文章中包含指向另一个问题的链接。

实际问题

  • Wrapping an Unmanaged C++ Class Library with C++/CLI - Question 1 - Project/Code Organization
  • 如何有效地包装/处理非托管类中的集合变量?
  • 集合对象是自定义模板列表类 (CObjectList<T>) 的 typedef,用于处理对象指针集合的管理。集合类提供所有基本的集合功能以及指针管理和解构时对象的清理/释放。所以对于 CWidget会有一个 typedef CObjectList<CWidget> CWidgetList;在代码中。
  • 代码和集合类模板参数中使用的大部分类都是类本身。但在某些情况下,该集合属于基类。这发生在自定义脚本 FLEX/BISON 解析器的解析结构中。例如,有一个 CCommand所有其他可用命令都继承自的类。所以会有CSetCommand , CPrintCommand , CIfCommand
  • 我想为了做到这一点,我必须创建我的集合包装类,它为非托管类和 C++/CLI 类维护单独的列表。内部集合对象将管理非托管对象,并且必须有一个托管集合/列表对象来存储项目的包装类。
  • 有没有人有任何关于如何做到这一点的例子/建议?或者如何编写一个可以将非托管和 C++/CLI 类类型作为参数的泛型类?
  • 最佳答案

    这是一个很难回答的问题,但我建议您有一个编码/转换层,可以将托管集合转换为非托管集合。保持你的库原样,只转换参数和返回。

    如果这就是我会做的

  • 收藏品并不庞大
  • 它们不会一直来回传递。
  • 您经常在客户端代码中获取集合,然后在托管区域中对其进行大量调用。

  • 由于这些原因
  • 它对 API 进行分层,使其更简单
  • 跨越非托管/托管边界可能成为瓶颈,应尽量减少

  • 这将是我的默认方法,除非我真的需要访问数据结构中库的功能(它不仅仅是有组织的数据——而是数据和行为)

    关于.net - 使用 C++/CLI 包装非托管 C++ 类库 - 问题 2 - 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4819801/

    相关文章:

    c# - 使用 NHibernate 和 memcached 帮助进行二级缓存

    c# - 在 try catch 中使用 try catch 好吗?

    c++ - 'get' 相当于 _set_se_translator?

    java - 映射中值的所有直接和间接键

    c# - 从自定义类对象列表中获取那些元素,这些元素的一个属性值可解析为 double

    Java 哈希集合

    .net - WinForms 应用程序的常见漏洞

    c# - 组合框值加载问题

    python - 从 python 调用 MATLAB 函数

    c++ - 编译器是否删除未使用的函数、定义、变量、宏、包含等?