gpt4 book ai didi

c# - 将结构传递给 C#

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:42 24 4
gpt4 key购买 nike

我正在编写代码以在 C++ 中解析一个复杂的字符串并从中创建一棵树。我想在 Visual Studio 2017 中使用 C# 来调用返回节点 vector 的 native c++ 方法。

一个节点看起来像:

class node
{
public:
std::vector<node> subnodes;
std::string name;
};

C++ 函数可能如下所示:

class noderizer
{
public:
node getNodes(std::string str);
};

调用 noderizer::getNodes(...) 成员并为 c# 创建等效类的最有效(编码时间,次要考虑速度)方法是什么?

我假设最好的方法是在 c# 中创建一个重复的类定义,然后将原生 std::strings 复制到托管 Strings 中”

public class node
{
public string name = string.Empty;
List<node> integers = new List<node>();
}

尚不清楚this article包含有关 c++ 互操作的最新信息,但有关 wrapping c++ native classes 的相关文章在 c# 中使用表示我很可能只是将 noderizer 原生 c++ 包装为 noderizer * m_Impl; 然后调用 getNodes 成员并复制每个参数。这是正确的方法吗?

最佳答案

您可以按照您引用的第一篇文章使用 pInvoke,但您返回的对象似乎相当复杂。我认为如果您还不精通数据编码(甚至那时),您将会花很多时间进行数据编码。 pInvoke 非常适合简单地调用 C 库,其中数据编码是基本的,但它很快就会变得非常复杂。这对您的情况不利。

第二篇文章更接近你想看的地方。话虽如此,您必须考虑是要包装一个托管类还是只调用一个函数,该函数接受一个字符串并以托管格式返回您的树(即它制作一个拷贝而不是包装非托管数据)。通过您的帖子,您似乎只需要后者。

最好的选择是使用 C++/CLI。查看this tutorial .我相信采用这种方法将使您轻松完成任务。我不会尝试解释这个主题,因为上面的文章做得很好。本质上,您将能够使用托管和非托管数据类型编写函数,其中所有数据编码都内置到环境中。一个简单的转换将在幕后为您整理数据。作为一个很大的好处,调试非常棒,因为您可以从 C# 到 C++/CLI 再到 C++ 代码并返回。

在上面的文章中,作者确实描述了如何包装一个非托管类,你可以很好地做到这一点,但你的问题仍然是数据转换。

我会分 4 个步骤解决您的问题:

  1. 在 C++/CLI 中编写一个静态函数 getNodes(),您可以像任何常规静态方法一样从 C# 调用它,将 string 作为参数传递。上面的文章将帮助你。还有See Here在创建 C++/CLI 项目时。
  2. getNodes() 将使用您的 C++ 代码创建非托管形式的
  3. 使用 getNodes()tree 从非托管形式转换为托管形式。
  4. 用 C# 将结果返回给调用者。

您的声明看起来像这样,其中 Node 是您的托管类,ref 关键字表示该类是托管的,^* 的托管版本。

public ref class noderizer
{
public:
static Node^ getNodes(String ^mStr);
};

此处 getNodes() 调用您的 C++ 函数并进行数据转换。我不认为你会花很长时间来弄明白。一旦您掌握了语法,如果您已经熟悉 C# 和 C++,我想您会发现它使用起来非常直观。

至于性能,除非您连续进行数千次调用或需要关键的实时数据,否则这应该不是问题。不过我要说的一件事是,如果您关心性能,则应该在单独的纯非托管 dll 中编写纯 C++ 代码。我一生都找不到这篇文章,但我记得看过一些基准测试,执行在 C++/CLI dll 中编译的纯非托管长时间运行的代码块与调用完全相同的代码,这些代码在其自身内部完全编译非托管 dll。如果我没记错的话,单独的 dll 大约快 3 倍。

关于c# - 将结构传递给 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47215450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com