Export std :: Vector Member в классе - PullRequest
       5

Export std :: Vector Member в классе

2 голосов
/ 05 декабря 2010

Я хочу экспортировать класс C ++, который имеет член std::vector<int>.Как экспортировать этот класс, чтобы мое приложение на C # могло его использовать?А как написать соответствующий .Net код?

Это то, что я пробовал до сих пор, следуя приведенным здесь примерам .

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

Но тогда яstucked.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2010

Что вы пытаетесь сделать? Я вижу BOOST_GRAPH_API, что ты задумал? Вы не сможете использовать нативный код C ++ из .Net напрямую, как и вы! Это заставит вас скомпилировать все импортированные зависимости в стандартной библиотеке C ++ и повысить (!) С поддержкой 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...

Обратите внимание, что dll экспортирует только интерфейс IMyClass и его создателя, и ничего более. В проекте 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;
    }

};
0 голосов
/ 05 декабря 2010

C # не может понять __declspec (dllimport), он может использовать только интерфейсы в стиле C. Вам придется пройти через C ++ / CLI, они предлагают преобразования STL -> .NET, IIRC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...