관리되지 않는 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'을 사용하는 참조를 보았습니다. 나는 그들이 어떻게 작동하는지 또는 내가 본 모든 것에서 정확히 무엇을하는지 이해하지 못한다.
나중에 C# 함수를 호출하는 올바른 서명의 래퍼 C++ 함수를 만들려고합니다. C++/CLI를 사용할 때 마샬링이나 interop이 필요하지 않습니다. 컴파일러가 언어 확장을 사용하여 이것을 처리하도록하는 것이 중요합니다. – millimoose
C# 어셈블리에 대한 종속성이 없도록 C++/CLI 코드에서 대리자 형식을 선언하십시오. 그것을 공개하십시오. Marshal.GetFunctionPointerForDelegate()를 사용하여 네이티브 코드에 전달할 수있는 포인터를 가져옵니다. 전달 된 대리자 객체를 저장하여 참조 된 상태로 유지하는 것을 잊지 마십시오. –
[C++/cli 패스 (관리되는) 비 관리 코드에 대한 대리인] 가능한 복제본 (http://stackoverflow.com/questions/2972452/c-cli-pass-managed-delegate-to-unmanaged-code) –