如何封送可变大小的结构数组? C# 和 C++ 互操作帮助

2023-11-27

我有以下 C++ 结构

struct InnerStruct
{
   int A;
   int B;
};

struct OuterStruct
{
   int numberStructs;
   InnerStruct* innerStructs;
};

和一个 C++ 函数

OuterStruct getStructs();

我怎样才能将其编组到 C# 中? C# 定义在哪里

struct OuterStruct {
   InnerStruct[] innerStructs;
};

您必须手动执行此操作,因为无法告诉 P/Invoke 层要从 C++ 返回值中封送多少数据。

struct OuterStruct {
   int numberStructs;
   IntPtr innerStructs;
};

OuterStruct s = getStructs(); // using DllImport
var structSize = Marshal.SizeOf(typeof(InnerStruct));
var innerStructs = new List<InnerStruct>();
var ptr = s.innerStructs;

for (int i = 0; i < s.numberStructs; i++)
{
    innerStructs.Add((InnerStruct)Marshal.PtrToStructure(ptr, 
        typeof(InnerStruct));
    ptr = ptr + structSize;
}

请注意,如果您想释放内存innerStructs在您的 C# 代码中,您必须使用标准分配器CoTaskMemAlloc在你的 C++ 代码中——然后你可以调用Marshal.CoTaskMemFree自由innerStructs.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何封送可变大小的结构数组? C# 和 C++ 互操作帮助 的相关文章

  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 无需 root 的 Python XML 解析

    我想解析一个相当大的类似 xml 的文件 它没有任何根元素 文件的格式为
  • 为什么版本 4 GUID 的第 17 位数字仅限于 4 种可能性?

    我知道这并不会减少所涉及的熵的很大一部分 而且即使 GUID 的另一个字符被保留 出于任何目的 我们仍然有足够的空间让每只昆虫拥有一个 所以我并不担心 只是好奇 As 这个很好的答案表明 版本4生成 GUID 的算法具有以下格式 xxxxx
  • Windows 上的 Git:强制使用 OpenSSH

    我安装了适用于 Windows 的 git 当出现选择 Putty 或 OpenSSH 的选项时 我选择了 OpenSSH 然而 我确实安装了 putty 并且 git 似乎发现了这一点并正在尝试使用它 我的环境变量中有GIT TRACE
  • 覆盖一个 django 表单元素上的数据验证

    我的表单上有一个选择列表下拉框 其中填充了来自模型 董事 的数据 这个下拉菜单的值不需要保存 它实际上仅用于动态触发表单的另一个元素 标题为 电影 的下拉列表 因此 当用户选择导演时 它会使用附加到该导演的电影动态填充第二个列表 第一个列表
  • 使用按钮调用 python 函数

    我希望能够单击 html 中的按钮并调用 python 函数 我努力了this它有效 但仅适用于文本 而且我已经看到了here您可以在按钮的操作中使用函数名称 但它不起作用 我不知道为什么 我不想在单击按钮后转到另一个页面 我想留在同一页面
  • 在 Android 中连接 2 个模拟器实例

    我想在2个模拟器中创建一个服务器和一个客户端来写入和读取数据 我为服务器编写代码 public class ServerActivity extends Activity Called when the activity is first
  • 当我们将多维数组传递给函数时,为什么可以省略它的第一维

    当我们将多维数组传递给函数时 为什么可以省略多维数组的第一维 在我的编程课上 我们被告知在将多维数组传递给函数时我们可以省略第一维 例如 a 10 15 20 可以传递为a 15 20 Why 因为数组将衰减为指针并计算数组元素的偏移量 所
  • 如果值在范围内,则合并 2 个数据帧

    我已经为此苦苦挣扎了一段时间 找不到任何方法 所以如果您能提供帮助 我将非常感激 我是编程新手 我的代码可能效率低下 但这是我能想到的最好的 基本上 我有 2 个 csv 文件 fixes csv 和zones csv 它们包含不同的变量并
  • 具有 ContainsTable 的多列和带有全文索引的布尔逻辑

    我有一个非常基本的场景 但我所读到的内容听起来使用 SQL Server 全文目录和索引并不容易 我有两列 名字和姓氏 我想支持对他们的全文搜索 这样如果有人输入 John Smith 则匹配的人both第一个和最后一个首先出现 虽然创建跨
  • 支持传播的 Spring 事务

    我想了解 Spring 事务与传播支持的用途 java 文档提到 如果该方法具有 Transactional propagation Propagation SUPPORTS 从事务内部调用它支持事务 但如果不存在事务 则该方法将以非事务方
  • 使用 DefaultHTTPClient 时如何显示所有 HTTP 标头?

    当使用DefaultHttpClient 从 Apache Commons HTTP 客户端 是否可以在控制台输出中显示完整的请求以进行调试 我的应用程序遇到问题 我觉得调试它的最简单方法是检查由应用程序发送的所有数据DefaultHTTP
  • PostgreSQL 的 random() 函数的质量如何?

    假设我正在创建一个表foo有一个柱子bar这应该是一个非常大的随机整数 CREATE TABLE foo bar bigint DEFAULT round 9223372036854775807 bigint double precisio
  • 如何在Sqlite中删除表与其他表的内连接?

    我的查询 DELETE a FROM TR ContactResultRecord a INNER JOIN TR Case b on a FireStationCode b FireStationCode and a CaseNo b C
  • DocumentFragment 浏览器支持

    今天我偶然发现了 createDocumentFragment 我想知道 DocumentFragment 是否受支持 以及如何在不同的浏览器上支持 特别是 IE 系列 有人知道关于这个主题的任何事情吗 是的 所有现代浏览器 包括 IE6
  • 在 ColdFusion 中使用带命名参数的冒号

    我在录音中看到了这个代码示例 想知道冒号语法的作用 我搜索了文档 但找不到任何相关信息 weather subscribe observer application observers currentConditions 我知道我们可以在
  • 如何在网站中嵌入 LIVE Colab Notebook?

    我想建立一个网站并将其部署到github页面或heroku 我的问题是 是否可以在我将托管的网站中嵌入 LIVE 我可以运行代码 Google Colab 笔记本 我想要这个嵌入式 Colab 笔记本来执行 Spark 代码 Thanks
  • 执行 jenkins sh 管道步骤时权限被拒绝

    我对这种情况有一些麻烦 每次我创建一个新的管道作业 标题为 管道 时 sh即使使用像这样的简单命令 步骤也不起作用ls or pwd它返回此日志 sh 1 var jenkins home workspace pipeline tmp du
  • Java EE 6 CDI 实现之间的差异

    我查看了 JBoss 的 JSR 299 上下文和依赖注入的 Weld 参考实现 我想知道其他 CDI 实现之间的比较 具体来说 我了解 Weld Resin CanDI 由 Caucho 开发 和 Apache OpenWebBeans
  • SQLite 连接未出现在实体数据模型向导中

    我做了什么才到达现在的位置 我安装了该程序集http system data sqlite org index html doc trunk www downloads wiki使用 GAC 和 VS2012 选项 我现在可以连接到现有的
  • 如何封送可变大小的结构数组? C# 和 C++ 互操作帮助

    我有以下 C 结构 struct InnerStruct int A int B struct OuterStruct int numberStructs InnerStruct innerStructs 和一个 C 函数 OuterStr