2011-01-24 8 views
5

ネイティブC++をラップするマネージC++コードを作成する必要があると思います。しかし、型がネイティブ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); 
    } 

}; 
+0

@CDBeanあなたの質問が更新されているか、詳細を提供する場合は、元の質問を編集して新しいデータを追加してください。 – Sampson

+1

'addDollar'への引数として' cli :: array a'が必要なのでしょう。これは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)を入れてはいけないのか分かりません。私はそれを削除しようとしましたが、間違っていることが判明しました。エラー "missing module" – ChanDon

関連する問題