Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改我的C++;在C#中用作DLL的代码? 我正在学习如何从C++中调用C++中的方法。我做了一些研究,似乎平沃克是一个很好的方式 P>我如何将这个简单的C++代码转换成它应该如何调用的方法,以及如何编写C?< /P>中调用的方法?_C#_C++_Pinvoke - Fatal编程技术网

如何更改我的C++;在C#中用作DLL的代码? 我正在学习如何从C++中调用C++中的方法。我做了一些研究,似乎平沃克是一个很好的方式 P>我如何将这个简单的C++代码转换成它应该如何调用的方法,以及如何编写C?< /P>中调用的方法?

如何更改我的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 {

我有一个头文件:

MathFuncsLib.h

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++来进行数学优化,你就必须把它从课堂上外包出去。我知道这不是问题所在,但我只是想提一下。哇,太酷了。我不知道你对被管理和未被管理的东西有那么多的控制权——至少,不是那样的。