我想导出一个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;
}
};
但后来我被困了。
答案 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;
}
};