P / Invoke больше подходит, когда у вас много статических функций. Вместо этого вы могли бы использовать C ++ / CLI , что более уместно, когда у вас есть набор классов C ++ или иерархия классов структурированной доменной модели. Вот как вы могли бы сделать это с вашим образцом:
.H:
namespace MathFuncs {
public ref class MyMathFuncs
{
public:
double Add(double a, double b);
};
}
.CPP:
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b) {
return a + b;
}
}
.CS:
static class Program
{
static void Main()
{
MyMathFuncs abd = new MyMathFuncs();
abd.Add(1.2, 2.3);
}
}
Как видите, вам не нужна функция getClass, как в C ++ / CLI, ваш класс MathFuncs становится полноценным .NET-классом.
РЕДАКТИРОВАТЬ: если вы хотите, чтобы фактические вычисления (a + b в образце) происходили в неуправляемом коде, вы можете сделать это следующим образом; например:
.H:
namespace MathFuncs {
public ref class MyMathFuncs
{
public:
double Add(double a, double b);
};
class MyMathFuncsImpl
{
public:
double Add(double a, double b);
};
}
.CPP:
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b) {
MyMathFuncsImpl *p = new MyMathFuncsImpl();
double sum = p->Add(a, b);
delete p;
return sum;
}
#pragma managed(push, off)
double MyMathFuncsImpl::Add(double a, double b) {
return a + b;
}
#pragma managed(pop)
}
В этом случае MyMathFuncsImpl :: Add генерируется как собственный код, а не как IL (вызов из C # такой же). Смотрите здесь: управляемый, неуправляемый для получения дополнительной информации о том, как смешивать управляемый и неуправляемый код.