2011-01-24 4 views
5

Я полагаю, что мне нужно создать управляемый код на C++ для переноса нативного C++. Но у меня возникла проблема при попытке обернуть массив, используемый в параметре функции, тип которого задан в native 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? Огромное спасибо!

Update

я сочинить 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); 
    } 

}; 
+0

@CDBean Если у вас есть обновления по вашему вопросу или более подробная информация для предоставления, пожалуйста, отредактируйте исходный вопрос, чтобы включить новые данные. – Sampson

+1

Вы, вероятно, хотите 'cli :: array a' для ваших аргументов' addDollar', это будет отображаться на C# как 'manageMoney [] a'. –

+0

Для 'unmanagedSum :: adddollar', вы уверены, что хотите' unmanagedMoney a [] ', а не' const unmanagedMoney & a'? Кажется, вам нужен только первый элемент в массиве, который может быть сделан с помощью ссылки (или указателя). –

ответ

1

Вы создаете C++/CLI исходного файла с

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

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

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

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

+0

Благодарим вас за ответ, но что, если функция-член имеет тип аргумента, определенный также на языке C++? Нужно ли также обматывать тип аргумента? – ChanDon

+0

@CDBean: Да. Не всегда имеет смысл иметь сопоставление 1: 1 между нативными и управляемыми типами (иногда может иметь смысл разделить структурный параметр на несколько параметров или что-то в этом роде), но вам нужно будет предоставить некоторую форму преобразования , –

+0

И я не знаю, почему я не должен помещать __declspec (dllexport) в класс. Я пытаюсь удалить его, но получается не так, с ошибкой «недостающий модуль», – ChanDon

Смежные вопросы