2011-02-07 3 views
5

관리되는 C# 코드에서 dll의 네이티브 C++ 함수를 사용하고 싶습니다. 하지만 내 함수는 std :: vector 같은 인수를받습니다. & - 벡터 참조 ... 어떻게이 인수를 dllimport 문에서 구현할 수 있습니까? 나는 예를 들어 IntPtr이 있다는 것을 알고 있지만 std :: vector <> 일 것이다.C#에서 네이티브 C++ 코드 사용 - std :: vector 문제

+1

이 아마 매우 어려운이 아니라면 불가능하다. 'C++ '라이브러리를위한'C' 인터페이스를 제공하고 그것을 대신 사용할 수 있습니까? – ereOn

+2

C++/CLI를 사용하여 래퍼 클래스를 작성하십시오. –

+1

해결 된 솔루션을 사용하여 필요한 것과 비슷한 것을 얻을 수 있지만 올바르게 이해하면 관리되지 않는 DLL과 관리되는 응용 프로그램의 코드를 모두 제어 할 수 있습니다.이 경우 아마도 dll에 함수에 대한 C++/CLI 래퍼를 제공하고 C#에서 직접 호출하는 것이 좋습니다. 어쩌면 STL.Net도 살펴 봐야 할 것입니다. 입문서 링크 : http://msdn.microsoft.com/en-us/library/ms379600%28v=vs.80%29.aspx – ds27680

답변

5

필자는 필요한 기능을 포장하고 C#에서 P/Invoke하는 "C"함수를 내보낼 것입니다. 이러한 "C"함수는 포인터와 데이터 버퍼의 크기로 std::vector<> 데이터를 노출 할 수 있습니다. 당신이 클래스 Bufferstd::vector<byte_t>이 예를 들어

말 :

class Buffer 
{ 
public: 
    const std::vector<byte_t>& GetData() const { return data_; } 

private: 
    std::vector<byte_t> data_; 
}; 

그런 다음 당신이 "C"기능을 제대로 범위를 수출 할 수있는 Buffer 당신이 사용하려는 :

Buffer* CreateBuffer(); 

그리고 std::vector<byte_t>에 데이터를 채워주는 네이티브 측면에서 뭔가를하고 싶을 것입니다 :

,210

그런 다음 그 데이터를 읽을 수 있습니다

void GetBufferData(const Buffer* buffer, const byte_t** data, int* size); 

그리고 마지막으로, 정리 :

void DestroyBuffer(Buffer* buffer); 

이/P에 그 "C"선언을 번역 C#을 측면에서 사람을 호출 :

[DllImport("YourBufferLib.dll")] 
static extern IntPtr CreateBuffer(); 

[DllImport("YourBufferLib.dll")] 
static extern void DoSomethingThatProduceData(IntPtr buffer); 

[DllImport("YourBufferLib.dll")] 
static extern void GetBufferData(IntPtr buffer, out IntPtr data, out Int32 size); 

[DllImport("YourBufferLib.dll")] 
static extern void DestroyBuffer(IntPtr buffer); 

네이티브 리소스가 올바르게 작동하는지 확인하는 IDisposable 클래스의 관리 측면에서 이러한 호출을 래핑하는 것이 좋습니다. 위로 앉았다.

은 [제 1, 약간 사소한 상기 "C"기능의 구현 세부 사항은 분명히 독자 운동으로 남겨진다.]

0

STL 벡터는 단독 템플릿 방법이다. 이론적으로 벡터의 해당 메소드에 대한 오프셋을 계산할 수 있으며 일부 코드 생성을 호출하고 호출 할 수 있습니다. STL 벡터는 내 보낸 메서드가 아닌 템플릿 전용 라이브러리이기 때문에 DllImport를 사용할 수 없습니다. 당신은 물론

int GetSize(vector<xxx> *vec) 
{ 
    return vec.size(); 
} 

같은 특정 메소드를 호출하는 C 스타일의 래퍼를 작성할 수 그러나 당신이 필요한 많은 관리 unmanged 전환이 갑자기 중단 응용 프로그램을 가지고 있기 때문에 그렇게하고 싶지 않아요. stl 벡터를 조작해야 할 경우 관리되는 C++을 사용하고 Managed C++ dll로 C#을 호출하여 벡터를 원하는대로 조작 할 수 있습니다. 많은 회사에서 C++의 주요 자산 인 느린 속도로 인해 관리되지 않는 전환의 비용에주의를 기울이지 않았기 때문에 Managed C++의 사용이 금지되었습니다.

너의 것, 로이스 크라우스

관련 문제