Как я могу изменить свой код C ++ для использования в качестве DLL в C #? - PullRequest
4 голосов
/ 05 января 2012

Я учусь, как вызывать методы в C ++ из C #.Я провел некоторое исследование, и кажется, что Pinvoke - хороший способ.

Как я могу перевести этот простой код C ++ в способ, которым он должен быть вызван в C #, и как я могу написать методыбыть вызванным в C #?

У меня есть файл заголовка:

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);
}

Я понятия не имею, как это должно быть достигнуто, поэтому я думаю, что лучше спросить об этом.

Ответы [ 4 ]

7 голосов
/ 07 февраля 2012

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 # такой же). Смотрите здесь: управляемый, неуправляемый для получения дополнительной информации о том, как смешивать управляемый и неуправляемый код.

0 голосов
/ 13 февраля 2012

Используя Microsoft Visual Studio (Express), я создал класс как обычно (без функции main(), конечно), но вы можете выбрать компиляцию как .dll. Преимущество состоит в том, что класс будет находиться в отдельном файле, который можно повторно использовать / вызывать из других приложений, которые вы разрабатываете.

0 голосов
/ 10 февраля 2012

Добавьте класс-оболочку вокруг вашего определенного класса в c ++ / cli или управляемого c ++. Это похоже на слой, который может напрямую связываться как с собственным c ++, так и c #

0 голосов
/ 05 января 2012

Вам не нужно использовать класс 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(); }
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...