2010-12-05 19 views
2

メンバーがstd::vector<int>のC++クラスをエクスポートしたいとします。私のC#アプリケーションがそれを消費できるようにこのクラスをエクスポートするには?そして対応する.Netコードを書く方法?クラスのstd :: Vectorメンバーをエクスポート

これは私がこれまで試したもので、例given hereに従っています。

#include <vector> 
# define BOOSTGRAPH_API __declspec(dllexport) 
# define EXPIMP_TEMPLATE 

EXPIMP_TEMPLATE template class BOOSTGRAPH_API std::vector<int>; 

    class BOOSTGRAPH_API MyClass 
    { 
    public: 
     std::vector<int> VectorOfInts; 

    public: 
     bool operator < (const MyClass c) const 
     { 
      return VectorOfInts < c. VectorOfInts; 
     } 
     bool operator == (const MyClass c) const 
     { 
      return VectorOfInts == c. VectorOfInts; 
     } 
    }; 

しかし、私はつまらない。

+0

はです#を#忘れた可能性がありますか?コンパイラは、どのようなベクトルがわからないようです。 – gnobal

+0

@gnobal、いいえ、私はしませんでした。コードスニペットが更新されました。 – Graviton

+0

@gnobal、コンパイルエラーを修正しました。しかし、今では、対応する.Netコードを書く方法を知らないままで立ち往生しています。更新された質問を参照してください。 – Graviton

答えて

0

あなたは何をしようとしていますか?私はBOOST_GRAPH_APIを参照してください、あなたは何ですか? .NetからネイティブC++コードを直接使用することはできません。これは、C++標準ライブラリとブースト(!)でインポートされたすべての依存関係をclrサポートでコンパイルすることを余儀なくされます。

適切なファクトリメソッドとともにクラスへのインターフェイスを定義する必要があります。

// imyclass.h 

__declspec(dllexport) 
IMyClass* CreateInstance(); 

__declspec(dllexport) 
class IMyClass { 
public: 
    virtual int CompareTo(IMyClass*) = 0; 
    virtual ~IMyClass() {} 
}; 

// myclass.h 

#include "imyclass.h" 
#include <vector> 

class MyClass : public IMyClass { 
    std::vector<int> mIntVector; 
public: 
    virtual int CompareTo(IMyClass*); 
    // constructors and access functions go here... 
}; 

// myclass.cpp 

#include "myclass.h" 
#include <memory> 

IMyClass* CreateInstance() { 
return new MyClass; 
} 

// implementations of whatever MyClass should do go here... 

何も、唯一のインタフェースIMyClassとその作成者が、DLLによってエクスポートされていることを確認していない:これらは安全にあなたが直接.NETプログラム内参照できるC++/CLIオブジェクトによってエクスポートとラップすることができます。 C++/CLIプロジェクトでは、IMyClassへのポインタを保持し、imyclass.hのみをインポートするC++/CLI使い捨てラッパーを定義します。 imprtラッパーのみIMyClass、それは創作者が何か以下のように似てますが、コンパイラによってautmatically生成されたもの瞬間に右、わからないファイナライザセマンティクスを取得するために世話をする必要があります...:

ref class IMyClassWrapper { 
    IMyClass* mPtrResource; 

public: 

    int CompareTo(IMyClassWrapper^ pOther) { 
     return this->mPtrResource->CompareTo(pOther->mPtrResource); 
    } 

    IMyClassWrapper() { 
    mPtrResource = ::CreateInstance(); 
    } 

    ~IMyClassWrapper() { 
    this->!IMyClassWrapper(); 
    } 

protected: 

    !IMyClassWrapper() { 
    delete mPtrResource; 
    mPtrResource = 0; 
    } 

}; 
+0

私は返す引数として 'std :: vector 'を.Netに渡したいと思います。それが可能かどうかは分かりません。 – Graviton

+0

いいえそうではありません。あなたは上記のようにそれをラップする必要があります。管理されたC++コードとアンマネージC++コードを混在させないように注意してください。上記のように別のプロジェクト(管理対象プロジェクト、管理対象外プロジェクト)を作成し、マネージドプロジェクトからアンマネージdllを参照する必要があります(または類似しています)。 –

0

C#は__declspec(dllimport)を理解できませんが、Cスタイルのインターフェイスだけをgrokできます。あなたはC++/CLIを通過する必要があります。彼らはSTL - >。NET変換、IIRCを提供します。

+0

残念ながら、私のC++コードの大部分は標準的な方法(すべてのプラットフォームで移植可能)で書かれているので、CLIの助けとしてコンパイルする方法がわかりません。それはコンパイルさえできないかもしれません! – Graviton

+0

@Ngu:C言語のインターフェースでコンパイルしたくない場合に、.NETコードとのインターフェースをとる場合は、選択肢がありません。 – Puppy

関連する問題