2013-08-09 2 views
0

비디오 스트림을 렌더링하는 데 openFrameworks를 사용하고 있습니다. OpenFrameworks는 이미지를 ofPixel (unsigned char 벡터 저장)의 벡터로 저장하는 ofImage 클래스를 사용합니다.C++ 비 관리 응용 프로그램에서 C# .NET 이미지 검색

각 프레임을 검색하기 위해 C# .NET dll을 사용하고 있습니다. 이 라이브러리는 Bitmap을 사용하여 검색된 프레임을 반환합니다. 지금까지 나는 C# .NET이 Common Language Runtime 아래에서 작동 함을 알고 있습니다.

내 질문에 네이티브 C++ 코드를 comunicate하고 C#을 관리하기 위해 사용할 수있는 .NET 도구 또는 기능은 무엇입니까?

+0

변환 unsigned char *에 대해 자세히 알아보기 그것이 C# 또는 .NET에 대해 아무 것도 몰라서 그것을 묻는 순간에 받아 들여지도록하십시오. 나는 질문의 질을 향상시키는 것을 어렵게 생각하고있다. 전체 질문에서 열악한 연구 결과가 표시되면 삭제해야합니까? –

답변

3

이미지를 검색하기 위해 나는 this tutorial을 사용했습니다. 관리되지 않는 코드에서 C# 관리되는 라이브러리를 사용하는 방법을 철저히 설명합니다.

내가 수행 한 프로세스는 here으로 기록되어 있습니다.

여기 개요

  • 네이티브 클래스 및/또는 함수를 만들 DLL은 C#에 대한 참조를 추가 C++/CLI 프로젝트 (비주얼 스튜디오의 새로운 프로젝트 대화 상자에서 CLR 클래스 라이브러리)을 만들 수 있다는 네이티브 월드에 필요한 C# dll 기능을 에 노출합니다.
  • 이 기본 프로젝트 (들)

소개에 링커 입력으로 C++/CLI 프로젝트에 의해 생성 된 lib 디렉토리를 추가 (__declspec (dllexport) 또는 .DEF 파일) 통상적 인 수단을 사용하여 내보내기 이미지 정보는 바이트 배열이라고 할 수 있습니다. GCHandle을 사용하여 관리 코드에 고정해야합니다. 다음은이 개념을 설명하기 위해 몇 가지 코드 (면책 조항은,이 답변은 original msdn forum post 다른 저자에 의해 제공되었다)입니다 :

#include <unordered_map> 

using namespace System; 
using namespace System::Runtime::InteropServices; 

std::unordered_map<void *, void *> dataHandles; 

void *getData() { 
    array<Byte>^ arr = gcnew array<Byte>(2); 
    arr[0] = 'C'; 
    arr[1] = '#'; 

    GCHandle handle = GCHandle::Alloc(arr, GCHandleType::Pinned); 
    void *data = (void *)handle.AddrOfPinnedObject(); 
    dataHandles.insert(std::make_pair(data, (void *)GCHandle::ToIntPtr(handle))); 
    return data; 
} 

void releaseData(void *data) { 
    auto i = dataHandles.find(data); 

    if (i != dataHandles.end()) 
     GCHandle::FromIntPtr((IntPtr)i->second).Free(); 
} 

#pragma unmanaged 

void native() { 
    char *data = (char *)getData(); 

    for (int i = 0; i < 2; i++) 
     printf("%c ", data[i]); 

    releaseData(data); 
} 

#pragma managed 

int main(array<System::String ^> ^args) { 
    native(); 
    return 0; 
} 

나는이 질문을 수정하기 위해 노력하고있어 특정 Bitmaphere

0

Google에서 빠른 검색을 사용 : Calling a C# function from a C++ DLL, 질문하기 전에 검색하십시오.

또한 C++ 응용 프로그램에서 C++/CLI를 사용하는 경우 직접 C# DLL을 사용할 수 있어야합니다.

+0

매우 구체적인 기능을 원한다면 하나의 방법이나 다른 방법을 사용하는 것이 더 나은지 알고 있습니까? 나는 사람들이 다른 방법을 토론하고있는 것을 발견했으며, 어떤 것이 내 경우에 더 적합한 지 확인하기를 원했습니다. 귀하의 대답은 그 좋은 리드 것 같다 –

+0

나는 C#을 애플 리케이션 내에서 C + + DLL을 호출하는 것이 더 일반적이지만, 둘 다 사용하지 않았지만 내가 지적한 질문으로, 하나의 함수 만 사용하려고한다면 역 P/Invoke가 최선의 방법 일 수 있습니다. – Rafael

+0

또 다른 가능성은 C++/CLI 인터페이스를 구현하거나 C++/CLI로 C# 코드를 구현하는 것입니다. 두 가지 방법 모두 역 P/호출 또는 COM보다 깨끗합니다. – Rafael

관련 문제