2012-10-24 1 views
2

관리되지 않는 C++ 코드가 C# 함수를 콜백으로 호출하기를 원합니다. CLI/C++ 클래스를 사용하여 비 관리 코드를 래핑했습니다. 이 CLI/C++ 클래스의 인스턴스는 C# 내에 존재합니다.CLI/C++ 코드에 C# 함수 포인터를 전달하려면 어떻게해야합니까?

C# 코드는 아래 텍스트와 같습니다. callBack 메서드에 대한 (대리자) 함수 포인터가 있습니다. CLI_class의 CLI 인스턴스가 있습니다. 어떻게 든 addValueChangedCallBack 함수에서 함수 포인터를주고 싶습니다.

public Setup(){ 
    tempFUNC myFuncObj = new tempFUNC(callBack) 
    CLI_class c=new CLI_class(); 
    c.addValueChangedCallBack(myFuncObj) 
} 

public delegate void tempFUNC(float x); 

void callBack(float x){ 
.... 
} 

은 그 때 나는 이런 식으로 뭔가를하고 싶은 CLI 코드 :

void addValueChangedCallback(void (*ManipCallBack)(float)){ 
    unmanagedCPPCLASS.addValueChangedCallback(ManipCallBack) 

} 

은 어떻게 C++ 포인터 (*)로 함수 포인터를 설정할 수 있습니다? 또한 C# 클래스는 이미 C++/CLI 프로젝트를 참조하고 사용하기 때문에 C++/CLI 프로젝트에서 C# 프로젝트를 참조 할 수 없습니다. 종속성 문제가 있습니까?

일부 사이트에서는 '데이터 마샬링'또는 'interop'을 사용하는 참조를 보았습니다. 나는 그들이 어떻게 작동하는지 또는 내가 본 모든 것에서 정확히 무엇을하는지 이해하지 못한다.

+0

나중에 C# 함수를 호출하는 올바른 서명의 래퍼 C++ 함수를 만들려고합니다. C++/CLI를 사용할 때 마샬링이나 interop이 필요하지 않습니다. 컴파일러가 언어 확장을 사용하여 이것을 처리하도록하는 것이 중요합니다. – millimoose

+0

C# 어셈블리에 대한 종속성이 없도록 C++/CLI 코드에서 대리자 형식을 선언하십시오. 그것을 공개하십시오. Marshal.GetFunctionPointerForDelegate()를 사용하여 네이티브 코드에 전달할 수있는 포인터를 가져옵니다. 전달 된 대리자 객체를 저장하여 참조 된 상태로 유지하는 것을 잊지 마십시오. –

+0

[C++/cli 패스 (관리되는) 비 관리 코드에 대한 대리인] 가능한 복제본 (http://stackoverflow.com/questions/2972452/c-cli-pass-managed-delegate-to-unmanaged-code) –

답변

0

두 프로젝트가 서로 참조하고 System.InteropServices.Runtime.Marshal.GetFunctionPointerForDelegate를 사용하여 함수 포인터를 가져올 수 있습니다.

만약 내가 당신이라면 C# 클래스 ComVisible을 만들고 C++ 코드를 COM 인터페이스를 통해 직접 호출 할 수 있습니다. 그렇게하면 C++/CLI 래퍼가 필요 없습니다. 래퍼는 겪고있는 것처럼 항상 고통 스럽습니다. C++/CLI는 용도가 있지만 래퍼를 만드는 것은 그렇지 않습니다.

+0

정말 고마워요 !! Visual Studio에서 수업을 서로 참조하도록 만드는 특별한 방법이 있다면 당신이십니까? 아니면 그들이 DLL을 참조해야합니까? – AAB

+0

프로젝트가 서로 참조해야합니다. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 ** 참조 추가 ... **를 선택하여이 작업을 수행 할 수 있습니다. ** – user1610015

+0

Visual Studio에서는 이전에이 작업을 시도 할 때 프로젝트 참조를 프로젝트에 추가 할 수 없다고 말했습니다 순환 종속성이 발생할 수 있습니다. 이것을 할 다른 방법이 있습니까? – AAB

관련 문제