如何将 c++ 类转换为托管类?

How to convert c++ class to managed class?

提问人:flydream 提问时间:11/14/2023 最后编辑:Filburtflydream 更新时间:11/14/2023 访问量:85

问:

我想使用此url:https://devblogs.microsoft.com/cppblog/inheriting-from-a-native-c-class-in-c/ 中的方法将c++类更改为c#托管类,但它无法在构造函数中工作。 类是这样的:

 class memoryTest
        {
          public:
          std::shared_ptr<void> object_ptr;
          std::deque<std::vector<int>> prev_vec_deque;
          std::string _cfg, _weight;
          int cur_id;
          float nms;
          bool wait_stream;

       };

to:[C# 托管类]

 public unsafe struct __CClass
       {

        //IntPtr* _vtable;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x2)]
        IntPtr[] shared_ptr_0;
        [MarshalAs(UnmanagedType.Struct, SizeConst = 0x5)]
        List<bbox_t[]> tracking_id;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x28)]
        public byte[] portText1;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x28)]
        public byte[] portText2;
        int cur_id;
        float nms;
        bool wait_stream;
      };

我看过X64asm代码,用指针来保持空格,然后构造,c++函数可以在其中分配结构,但是出了点问题。 问题在于:如何转换 deque 和 shared_ptr?

_cpp = (__CClass*)Marshal.AllocHGlobal((IntPtr)(sizeof(__CClass) ));
RtlZeroMemory((IntPtr)_cpp, (UIntPtr)sizeof(__CClass));           
//Call constructor _CClass_Constructor(_cpp, configurationFilename, weightsFilename, 0, 1);

System.Runtime.InteropServices.MarshalDirectiveException:“无法封送'参数 #1':指针无法引用封送结构。请改用 ByRef。

C# C++ CLR

评论

2赞 Pepijn Kramer 11/14/2023
了解 C++/cli,但我根本不会使用继承,而是使用聚合(继承已经被过度使用)。这是我所知道的最简单的入门:快速 C++/CLI - 在不到 10 分钟的时间内学习 C++/CLI
2赞 shingo 11/14/2023
这些 std::xxx 的东西也是类,你需要先转换它们。
0赞 Charlieface 11/14/2023
你根本不能在 C# 中使用,它不知道如何封送它们std::
1赞 JonasH 11/14/2023
这听起来像是一个可怕的想法。有一些方法可以处理 c# 和 c++ 之间的互操作,但在最好的情况下,它们往往很复杂且有问题。如果类很小,最好用 c# 重写它。
0赞 flydream 11/22/2023
感谢您的回答。我已经知道该怎么做了。两种方式(C++ 和 CLR) 1.编写 Manage 包装类 2。编写一个 c++ DLL 并将该类包装为一个简单的类,该类可以轻松转换为 C#。以上所有内容都需要为其编写包装 DLL。希望这可以帮助其他人。

答: 暂无答案