2010-12-05 148 views
2

我想导出一个C++类,该类有一个成员std::vector<int>。如何导出此类,以便我的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

是有可能你忘了#include ?编译器似乎不知道什么是矢量。 – gnobal 2010-12-05 11:17:45

+0

@gnobal,不,我没有。代码片段已更新。 – Graviton 2010-12-05 11:19:44

+0

@gnobal,我修复了编译错误。但现在卡在不知道如何编写相应的.Net代码。查看更新的问题。 – Graviton 2010-12-05 11:26:12

回答

0

你想做什么?我看到BOOST_GRAPH_API,你在干什么?您将无法直接使用.Net中的本机C++代码,也不应该!这将迫使你编译C++标准库中所有导入的依赖项,并用clr支持boost(!)...

您需要为类定义接口以及正确的工厂方法。这些可以安全出口和包装,通过它可以直接的.Net程序中引用C++/CLI对象:

// 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,没有别的出口。在C++/CLI项目中,您定义了一个C++/CLI一次性包装器,其中包含指向IMyClass的指针并仅导入imyclass.h。这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

C#无法理解__declspec(dllimport),它只能使用C风格的接口。你将不得不通过C++/CLI,他们提供STL - > .NET转换,IIRC。

相关问题