скажем, у меня есть функция библиотеки C ++ для вычисления PI:
// pi.h:
#ifdef BUILDING_DLL
#define DLL_MACRO __declspec(dllexport)
#else
#define DLL_MACRO __declspec(dllimport)
#endif
namespace Cpp {
class PI {
public:
static double DLL_MACRO compute();
};
};
// pi.cpp:
#include "pi.h"
#include <cmath>
double
Cpp::PI::compute() {
// Leibnitz summation formulae:
double sum = 0.0;
for(long n = 0; n < 100*1000*1000; n++)
sum += 4.0*pow(-1.0, n)/(2*n + 1.0);
return sum;
}
Мне нужно вызвать эту функцию из C #, и я хочу использовать C ++ / CLI в качестве «моста».Однако эта функция C ++ несколько медленная.Поэтому код C #, вызывающий эту функцию, должен получить обратные вызовы, сообщающие, как далеко зашла функция в%.Код C # может нуждаться в некотором состоянии, например, индикатор выполнения, чтобы иметь дело с этой информацией.Поэтому обратные вызовы из C ++ должны входить в функцию-член на стороне C #.
Итак, я представляю:
// piCLI.h: The C++/CLI "bridge" between C# and C++
#include "pi.h"
#pragma once
namespace CLI {
public ref class PI abstract {
public:
double compute() {
return Cpp::PI::compute();
}
virtual void progress(int percentCompleted) = 0;
};
};
и
namespace CSharp
{
public class PI : CLI.PI
{
public override void progress(int percentCompleted)
{
System.Console.WriteLine(percentCompleted + "% completed.");
}
}
}
Теперь вызывается CSharp.PI.compute () работает отлично :-).Он перенаправляет вызов Cpp :: PI :: compute (), как и предполагалось.
Но как мне получить библиотеку C ++ для пересылки обновлений прогресса в CSharp.PI.progress (), тогда как Cpp :: PI ::compute () запущен?
Заранее спасибо за любые ответы!