如何使用 Mono Project 将 C/C++ 指针传递和保存到 C#,并将它们返回

Posted

技术标签:

【中文标题】如何使用 Mono Project 将 C/C++ 指针传递和保存到 C#,并将它们返回【英文标题】:How can I pass and save C/C++ pointers to C#, and return them back, using Mono Project 【发布时间】:2019-02-02 01:51:06 【问题描述】:

我在弄清楚如何有效地将 C 指针传递和存储到 C#,然后在我需要 Mono 时将它们返回时遇到了一个严重的问题。我正在 C++ 之上使用 C# 构建脚本层。例如(伪代码):

C++:

GameObject* owner = new GameObject();
void* args[1] = owner;
return_object = mono_runtime_invoke("InitReference", mono_object, args, &exception);

C#:(C# GameObject 类实例)

public IntPtr InitReference(IntPtr game_object_ptr)

    return game_object_ptr;

我想要实现的是 C++ 对象实例和实际 C# 表示之间的关系。这方面的信息很少,我有点迷茫。

【问题讨论】:

只是一个建议,但 C# 并不适合脚本语言。也许您可以改用 lua 并使用类似:github.com/ThePhD/sol2/tree/sol3 【参考方案1】:

我的建议: 新建一个具有 StructLayout 属性的 .Net 结构,例如:

[StructLayout( LayoutKind.Explicit )]
public struct GameObject

  [FieldOffset(0)]
  public int Id;
  ......

然后.net 指针可以指向结构实例。

【讨论】:

【参考方案2】:

经过一番尝试,我解决了我的问题: 首先,我将指针地址存储到 char 缓冲区中,然后将其作为整数数组 int[] 传递给 mono。这允许我的指针地址在 C# 环境中保持活动状态,并且我可以随时检索它。

【讨论】:

以上是关于如何使用 Mono Project 将 C/C++ 指针传递和保存到 C#,并将它们返回的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mono.Zeroconf 制作 AirPlay 接收器

在Mono中获取MissingDLL错误

将 mono 与嵌入它的 c++ 应用程序捆绑在一起

我是否需要特殊许可才能分发使用mkbundle编译的Mono可执行文件?

从游戏脚本语言说起,剖析Mono所搭建的脚本基础

一个eclipse里面如何建立两个互不影响的project, 如建立一个Cproject和一个javaproject?