관리되는 C# 코드에서 dll의 네이티브 C++ 함수를 사용하고 싶습니다. 하지만 내 함수는 std :: vector 같은 인수를받습니다. & - 벡터 참조 ... 어떻게이 인수를 dllimport 문에서 구현할 수 있습니까? 나는 예를 들어 IntPtr이 있다는 것을 알고 있지만 std :: vector <> 일 것이다.C#에서 네이티브 C++ 코드 사용 - std :: vector 문제
답변
필자는 필요한 기능을 포장하고 C#에서 P/Invoke하는 "C"함수를 내보낼 것입니다. 이러한 "C"함수는 포인터와 데이터 버퍼의 크기로 std::vector<>
데이터를 노출 할 수 있습니다. 당신이 클래스 Buffer
에 std::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>
에 데이터를 채워주는 네이티브 측면에서 뭔가를하고 싶을 것입니다 :
그런 다음 그 데이터를 읽을 수 있습니다
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"기능의 구현 세부 사항은 분명히 독자 운동으로 남겨진다.]STL 벡터는 단독 템플릿 방법이다. 이론적으로 벡터의 해당 메소드에 대한 오프셋을 계산할 수 있으며 일부 코드 생성을 호출하고 호출 할 수 있습니다. STL 벡터는 내 보낸 메서드가 아닌 템플릿 전용 라이브러리이기 때문에 DllImport를 사용할 수 없습니다. 당신은 물론
int GetSize(vector<xxx> *vec)
{
return vec.size();
}
같은 특정 메소드를 호출하는 C 스타일의 래퍼를 작성할 수 그러나 당신이 필요한 많은 관리 unmanged 전환이 갑자기 중단 응용 프로그램을 가지고 있기 때문에 그렇게하고 싶지 않아요. stl 벡터를 조작해야 할 경우 관리되는 C++을 사용하고 Managed C++ dll로 C#을 호출하여 벡터를 원하는대로 조작 할 수 있습니다. 많은 회사에서 C++의 주요 자산 인 느린 속도로 인해 관리되지 않는 전환의 비용에주의를 기울이지 않았기 때문에 Managed C++의 사용이 금지되었습니다.
너의 것, 로이스 크라우스
- 1. std :: vector 문제
- 2. std :: vector 노출 코드 booststring ::
- 3. std :: vector, std :: map 및 메모리 문제
- 4. C++ std :: vector 요소를 사용하여 std :: vector 요소를 재정렬하십시오.
- 5. std :: vector 중간에 추가하기
- 6. itdate std :: vector <std :: vector <char>>?
- 7. std :: vector abort problem
- 8. std :: vector <std::string> 충돌
- 9. 클래스에서 std :: Vector 멤버 내보내기
- 10. C++ : std :: vector 및 input interator
- 11. std :: vector 요소가 연속적으로 보장됩니까?
- 12. 안드로이드 JNI 네이티브 C++ 코드 GetPrimitiveArrayCritical() 문제
- 13. std :: sort on std :: vector <std::string>
- 14. 네이티브 C에서 .NET 관리 코드 호출
- 15. std :: multimap과 std :: vector 사이에 교차가 있습니까?
- 16. std :: copy 사용 문제
- 17. std :: vector insert() 재 할당
- 18. std :: vector 삽입의 상각 분석
- 19. std :: vector 데이터를 유지하지 않습니까?
- 20. std :: vector 및 iterator를 단일 템플릿으로 사용 typename
- 21. C Vector/ArrayList/LinkedList
- 22. std :: vector 및 std :: string을 사용하여 포인터 및 참조와 관련된 특정 문제가 있습니다. std :: vector, std :: string
- 23. GWT에서 네이티브 (C++) 코드 호출
- 24. std :: vector <std :: pair <int, std :: pair <Bone, std :: string>> int로 정렬하지 않습니까?
- 25. 타입 'std :: vector <Object*> &'
- 26. std :: vector :: clear()를 호출하면 std :: vector :: capacity()가 0으로 설정됩니까?
- 27. Visual C++에서 std :: vector :: erase()의 세그먼트 오류가
- 28. C#에서 코드 사용 #
- 29. 문제 C++ STD Iterator 비교 연산자
- 30. std :: vector :: end()에 대한 질문
이 아마 매우 어려운이 아니라면 불가능하다. 'C++ '라이브러리를위한'C' 인터페이스를 제공하고 그것을 대신 사용할 수 있습니까? – ereOn
C++/CLI를 사용하여 래퍼 클래스를 작성하십시오. –
해결 된 솔루션을 사용하여 필요한 것과 비슷한 것을 얻을 수 있지만 올바르게 이해하면 관리되지 않는 DLL과 관리되는 응용 프로그램의 코드를 모두 제어 할 수 있습니다.이 경우 아마도 dll에 함수에 대한 C++/CLI 래퍼를 제공하고 C#에서 직접 호출하는 것이 좋습니다. 어쩌면 STL.Net도 살펴 봐야 할 것입니다. 입문서 링크 : http://msdn.microsoft.com/en-us/library/ms379600%28v=vs.80%29.aspx – ds27680