如何更改我的C++;在C#中用作DLL的代码? 我正在学习如何从C++中调用C++中的方法。我做了一些研究,似乎平沃克是一个很好的方式 P>我如何将这个简单的C++代码转换成它应该如何调用的方法,以及如何编写C?< /P>中调用的方法?
我有一个头文件: MathFuncsLib.h如何更改我的C++;在C#中用作DLL的代码? 我正在学习如何从C++中调用C++中的方法。我做了一些研究,似乎平沃克是一个很好的方式 P>我如何将这个简单的C++代码转换成它应该如何调用的方法,以及如何编写C?< /P>中调用的方法?,c#,c++,pinvoke,C#,C++,Pinvoke,我有一个头文件: MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: double Add(double a, double b); MyMathFuncs getClass(); }; } MathFuncsLib.cpp #include "MathFuncsLib.h" namespace MathFuncs {
namespace MathFuncs
{
class MyMathFuncs
{
public:
double Add(double a, double b);
MyMathFuncs getClass();
};
}
MathFuncsLib.cpp
#include "MathFuncsLib.h"
namespace MathFuncs
{
MyMathFuncs MyMathFuncs::getClass() {
return *(new MyMathFuncs());
}
double MyMathFuncs::Add(double a, double b) {
return a + b;
}
}
在C#中
我希望:
main()
{
MyMathFuncs abd = MyMathFuncs::getClass();
abd.Add(1.2, 2.3);
}
我不知道应该如何实现它,所以我认为最好问问它。您不需要使用get类,除非您的构造函数是私有的。 如果它是公共的,请像以下那样使用:
main()
{
MyMathFuncs abd = new MyMathFuncs();
abd.Add(1.2,2.3);
}
如果希望构造函数是私有的,并使用getClass获取类的实例,则应将该方法设置为静态,如:
namespace MathFuncs
{
class MyMathFuncs
{
public double Add(double a, double b);
static MyMathFuncs getClass() { return new MyMathFuncs(); }
};
}
当您有很多静态函数时,p/Invoke更适合。你可以使用,当你有C++类的集合或类的结构域模型层次结构时,这是更合适的。以下是您如何使用您的样本: A.H:
namespace MathFuncs {
public ref class MyMathFuncs
{
public:
double Add(double a, double b);
};
}
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) {
return a + b;
}
}
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)
}
政务司司长:
static class Program
{
static void Main()
{
MyMathFuncs abd = new MyMathFuncs();
abd.Add(1.2, 2.3);
}
}
如您所见,您不需要像C++/CLI那样使用getClass函数,MathFuncs类将成为一个成熟的.NET类
编辑:如果希望实际计算(示例中的a+b)发生在非托管代码中,可以这样做;例如:
A.H:
namespace MathFuncs {
public ref class MyMathFuncs
{
public:
double Add(double a, double b);
};
}
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) {
return a + b;
}
}
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#调用是相同的)。请参阅:关于如何混合托管和非托管代码的更多信息。 < P>在C++/CLI或托管C++中添加定义类的包装类,它可以像使用C++ Visual Studio(Express)直接与本地C++和C*< < /P> < P>合并,我按正常创建了该类(没有<代码>主())当然是函数),但您可以选择编译为
.dll
。优点是,该类将位于一个单独的文件中,可以从您正在开发的其他应用程序中重用/调用该文件。有趣的问题。我不确定它是否能够实现(名称混乱是一个需要克服的困难,也是导出类的基本前提),我不知道这样的事情是如何实现的,但您可以尝试结合P/Invoke和C++/CLR来考虑。雷蒙德·陈在《新旧事物》上发表的博文可能也会引起你的兴趣。Pinvoke不是你想称之为课程的东西。要做到这一点,你们最好使用C++/CLI。不管是哪种方式,你们两个能提供一些示例吗?@DavidHeffernan,C++/CLI是我想到的,谢谢你的建议。我意识到发布的代码只是一个示例,但你正在走向一个bruisin。它甚至不能安全地从C++程序中使用,你将很幸运地从C语言中工作。按值返回对象需要复制构造函数和赋值运算符重载。存在严重的内存管理问题,客户端代码需要使用适当的分配器来销毁对象。Add()方法是一个实例方法,没有充分的理由。首先要编写好的C++代码,而互操作将是一个更容易的操作。你似乎忽略了pPoCKE和互操作问题。你希望如何调用C++代码中的C++函数?@ SEFIX:我想做:MyMathStaskABD= MyMathSimuls::GETCHILL();为了理解C++中的对象是如何被检索的,记住,如果IL没有错,数学就会在这里结束,所以如果你使用C++来进行数学优化,你就必须把它从课堂上外包出去。我知道这不是问题所在,但我只是想提一下。哇,太酷了。我不知道你对被管理和未被管理的东西有那么多的控制权——至少,不是那样的。