2010-12-05 6 views
2

멤버가 std::vector<int> 인 C++ 클래스를 내보내려고합니다. 내 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

인가 # 을 # 포함하는 것을 잊었을 가능성이 있습니까? 컴파일러는 어떤 벡터인지 알지 못하는 것 같습니다. – gnobal

+0

@gnobal, 아니에요. 코드 스 니펫이 업데이트되었습니다. – Graviton

+0

@gnobal, 컴파일 오류가 수정되었습니다. 하지만 지금은 붙어 어떻게 대응하는. 닷넷 코드를 작성 해야할지 모르겠다. 업데이트 된 질문을 참조하십시오. – Graviton

답변

0

무엇을하려하십니까? 내가 BOOST_GRAPH_API를 보았는데, 너 무슨 일이야? 닷넷의 네이티브 C++ 코드를 직접 사용할 수 없으며 반드시 그렇게 할 필요가 없습니다! 그렇게하면 C++ 표준 라이브러리에 모든 가져온 종속성을 컴파일하고 clr을 지원하여 부스트 (!) 할 수 있습니다. ...

적절한 팩토리 메소드와 함께 클래스에 대한 인터페이스를 정의해야합니다.

// 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 만 가져 오는 C++/CLI 일회용 래퍼를 정의합니다. imprt 래퍼 만 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

.Net에 반환 인수로'std :: vector '을 전달하고 싶습니다. 가능하면 가능하지 않은가 확실하지 않습니다. – Graviton

+0

아니요. 위와 같이 포장해야합니다. 관리되는 C++ 코드와 관리되지 않는 C++ 코드를 함께 사용하지 마십시오. 별도의 프로젝트 (하나는 관리되고 또 하나는 관리되지 않음)를 만들고 위의 그림과 같이 관리되는 프로젝트에서 관리되지 않는 dll을 참조해야합니다 (또는 비슷하지만 게시물에서 누락 된 일부 세부 사항이 있습니다) ... –

0

C#은 __declspec (dllimport)을 이해할 수 없으며 C 스타일 인터페이스 만 사용할 수 있습니다. C++/CLI를 거쳐야 할 것입니다. STL -> .NET 변환, IIRC를 제공합니다.

+0

불행히도 내 C++ 코드의 상당 부분이 표준 방식 (모든 플랫폼에서 이식 가능)으로 작성되어 CLI가 도움이되는 것처럼 컴파일하는 방법을 잘 모르겠습니다. 그것은 심지어 컴파일되지 않을 수도 있습니다! – Graviton

+0

@Ngu : C 인터페이스로 컴파일하지 않고 .NET 코드와 인터페이스하려는 경우에는 선택의 여지가 없습니다. – Puppy

관련 문제