Что вы пытаетесь сделать? Я вижу 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;
}
};