在类中导出std :: Vector成员

时间:2010-12-05 11:13:38

标签: .net c++ interop

我想导出一个C ++类,它有一个成员std::vector<int>。如何导出这个类,以便我的C#应用​​程序可以使用它?以及如何编写相应的.Net代码?

这是我到目前为止所做的,遵循示例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;
        }
    };

但后来我被困了。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

// 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。仅包含IMyClass及其创建者的包装器应该类似于下面显示的内容,但要注意使得终结器语义正确,目前还不确定编译器自动生成什么...:

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;
    }

};