Отправить обратные вызовы из C ++ / CLI в C# с использованием класса или структуры? - PullRequest
0 голосов
/ 14 марта 2020

Я хочу отправить обратный вызов класса объекта или структуры из C ++ в C#,
Я успешно отправил int или строку, но не смог отправить обратно класс. пожалуйста, помогите.

Ссылка: Обратные вызовы с C ++ обратно на C#

Код: C ++ pi.h


namespace Cpp {

    class Box
    {
    public:
        double length;   // 长度
        double breadth;  // 宽度
        double height;   // 高度
    };

    typedef void(__stdcall *ComputeCallback)(Box);

    class PI {
    public:
        static double DLL_MACRO compute(ComputeCallback callback);
    };
}

C ++ pi. cpp

#include "pch.h"
#include "pi.h"
// pi.cpp: 
#include <cmath>

double Cpp::PI::compute(Cpp::ComputeCallback callback) {
    //System::String^ myString2 = "jumped over the lazy dog.";
    Box Box1; 
    Box1.height = 5.0;
    Box1.length = 6.0;
    Box1.breadth = 7.0;

    callback(Box1);
    return 0;
}

Файл моста C ++ piCLI. cpp

#pragma once
#include "pi.h"

using namespace System;

//bridge file
namespace ClassLibrary2 {
    public delegate void ComputeDelegate(Cpp::Box);

    public ref class PI abstract sealed {
    public:
        static double compute(ComputeDelegate^ callback) {
            using System::IntPtr;
            using System::Runtime::InteropServices::Marshal;

            IntPtr cbPtr = Marshal::GetFunctionPointerForDelegate(callback);
            return Cpp::PI::compute(
                static_cast<Cpp::ComputeCallback>(cbPtr.ToPointer())
            );
        }
    };
}

C#

using ClassLibrary2;

namespace CallbackWpf
{  
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Trace.WriteLine("______ start");

            ClassLibrary2.PI.compute(
                Box1 => Trace.WriteLine(Box1));
        }
    }
}

Ошибка:

System.TypeAccessException: 'Попытка методом' CallbackWpf.MainWindow + <> c. <. Ctor> b__0_0 (Cpp .Box) 'для доступа к типу' Cpp .Box 'не удалась.'

...