将结构传递给C# 我编写代码来解析C++中的复杂字符串并从中创建树。我想使用VisualStudio 2017中的C++来调用返回节点向量的本机C++方法。

将结构传递给C# 我编写代码来解析C++中的复杂字符串并从中创建树。我想使用VisualStudio 2017中的C++来调用返回节点向量的本机C++方法。,c#,c++,.net,pinvoke,C#,C++,.net,Pinvoke,节点看起来像: class node { public: std::vector<node> subnodes; std::string name; }; 调用noderizer::getNodes(…)成员并为c#创建等效类的最有效的方法是什么(编码时间,其次考虑速度) 我假设最好的方法是在c#中创建一个重复的类定义,然后将本机std::strings复制封送到托管strings” 公共类节点 { 公共字符串名称=string.Empty; 列表整数=新列表(

节点看起来像:

class node
{
  public:
    std::vector<node> subnodes;
    std::string name;
};
调用
noderizer::getNodes(…)
成员并为c#创建等效类的最有效的方法是什么(编码时间,其次考虑速度)

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

公共类节点
{
公共字符串名称=string.Empty;
列表整数=新列表();
}

不清楚是否包含C++互操作的最新信息,但有关C语言中使用的相关文章表明,我最可能只需将<代码> NoDrime< /Cuth.NealC++作为<代码> NoDeReals*MyIMPL;< /Cord>,然后调用<代码> GETNoSe< <代码>成员,并复制每个参数。这是正确的方法吗?< /P> < P>根据您的第一篇参考文章,uld将使用pInvoke,但您返回的对象似乎相当复杂。我认为如果您还不精通数据编组(即使如此),您将在数据编组方面度过一段相当长的时间.pInvoke非常适合于对C库的简单调用,其中数据编组是最基本的,但它会变得非常复杂,速度非常快。这对您的情况不利

第二篇文章更接近于你想看的地方。也就是说,你必须考虑你是想包装一个托管类还是调用一个函数,它接收一个字符串并以托管格式返回你的树(也就是说,它复制了一个副本而不是包裹非托管数据)。 您最好的选择是使用C++/CLI。请检查。我相信采用这种方法将使您的任务轻松完成。我不会试图解释这一主题,因为上面的文章做得非常好。本质上,您将能够编写托管和非托管数据类型的函数,其中所有数据编组都内置在en中一个简单的演员会在后台为你整理数据。作为一个大的奖励,调试是很好的,因为你可以从C++到C++到CLI,再到C++代码。 在上面的文章中,作者确实描述了如何包装一个非托管类,您可以很好地做到这一点,但您的问题仍然是数据转换

我将分4个步骤处理您的问题:

  • 在C++/CLI中编写一个静态函数
    getNodes()
    ,您可以从C#作为任何常规静态方法调用该函数,并将
    字符串作为参数传递。上述文章将对此有所帮助。在创建C++/CLI项目时也是如此
  • 代码> GETNODESE()/Cuff>将使用C++代码以非托管形式创建树>代码> < <
  • 使用
    getNodes()
    从非托管表单转换为托管表单
  • 用C#将结果返回给调用者
  • 您的声明如下所示,
    节点
    是您的托管CALS,
    ref
    关键字表示该类是托管的,
    ^
    *
    的托管版本

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

    这里代码> GETNODESE()/CUT>调用C++函数并进行数据转换。我想你不会花很长时间来解决它。 一旦你掌握了语法,我想如果你已经熟悉C语言和C++,你会发现使用它是非常直观的。


    至于性能,除非你做了几千次连续的调用或者需要关键的实时数据,否则它不应该是一个问题。但是我想说的是,如果你关心性能,你应该把纯C++代码写在一个单独的纯非管理的DLL中。我找不到我生命中的文章,但我记得我看过一些。在C++/CLI DLL中编译的纯非托管长代码块的基准,调用了在它自己的纯非托管DLL中编译的完全相同的代码。如果我记得正确,单独的DLL有点像3X快。< /P>是的,您可以使用托管C++,通过C++公开C++方法,并且还有更多。它在C++和C语言中有相同的树形结构的好处吗?它实际上取决于所有这些用法的用法。通常(尤其是当你拥有两边时,托管和非托管)你把一种语言用于一种用法/场景,你不需要在两种语言中做任何代码。@ WP78DE我不知道有什么明显的好处,我只是不知道C++中的数据结构在C语言中是什么样的扩展。我的理解是字符串向量必须在托管和非托管代码之间手动传输。

    public class node
    {
        public string  name = string.Empty;
        List<node> integers = new List<node>();
    }
    
    public ref class noderizer
    {
    public:
        static Node^ getNodes(String ^mStr);
    };