假设我有一个用于计算圆周率的C++库函数:
// 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()。
但是当Cpp::PI::compute()正在运行时,如何让C++库将进度更新转发到CSharp.PI.progress()?
感谢您提前的回答!