Как вызвать класс C ++ из C # - PullRequest
5 голосов
/ 24 января 2011

Полагаю, мне нужно создать управляемый код C ++, чтобы обернуть собственный C ++. Но у меня проблема при попытке обернуть массив, используемый в параметре функции, тип которого определен в нативном C ++. Собственный код C ++ выглядит следующим образом:

//unmanageCPP.h
class __declspec(dllexport) unmanageMoney
{
public:
    unmanageMoney(int a, int b) { rmb = a; dollar = b; }
    unmanageMoney() { rmb = 0; dollar = 0; }
    int rmb;
    int dollar;
};

class __declspec(dllexport) unmanageSum
{
public:
    //how to wrap this funciton?
    int addDollar(unmanageMoney a[], unmanageMoney b[]);
};

//unmanageCPP.cpp
#include "unmanaged.h"

int unmanageSum::adddollar(unmanageMoney a[], unmanageMoney b[])
{
    return a[0].dollar + b[0].dollar;
}

Может кто-нибудь сказать мне, как написать manageCPP.h? Большое спасибо!

Обновление

Я пишу manageCPP.h следующим образом, но я не знаю, как написать addDollar ()

//first, I wrap the class unmanageMoney for use in manageSum::addDollar()
public ref class manageMoney
{
private:
    unmanageMoney* mMoney;
public:
    unmanageMoney getMoney()
    {
        return *mMoney;
    }
    manageMoney(int a, int b)   { mMoney = new unmanageMoney(a, b); }
    ~manageMoney()  { delete mMoney; }
};

public ref class manageSum
{
    // TODO: Add your methods for this class here.
private:
    unmanageSum *mSum;
public:
    manageSum()
    {
        mSum = new unmanageSum();
    }
    ~manageSum()
    {
        delete mSum;
    }

    //it must be wrong if I code like this, for unmanageSun::adddollar() only
    // receives unmanageMoney as arguments. So what should I do?
    int adddollar(manageMoney a[], manageMoney b[])
    {
            return mSum->adddollar(a, b);
    }

};

1 Ответ

1 голос
/ 24 января 2011

Вы создаете исходный файл C ++ / CLI с помощью

public ref class SomethingOrOther
{
    //...
};

и устанавливаете параметры компиляции для использования параметра /clr.

Кроме того, это почти то же самое, что писать нативныйC ++.Вы будете #include заголовочный файл для класса, который вы хотите использовать повторно, создавать экземпляры и вызывать их функции-члены, точно так же, как в обычном C ++.Но все, что внутри ref class будет видно C #.

И вы НЕ помещаете __declspec(dllexport) в класс.Никогда не.Это полезно для функций, но создает трудности при использовании с классами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...