2011-01-31 4 views
0

관리되지 않는 C++에서 관리되는 대리자를 호출해야하는 취미 프로젝트에서 작업하고 있습니다. 외부 제약 때문에 런타임시 관리 코드에서 관리되지 않는 코드로 대리자를 전달해야합니다.COM interop을 사용하여 관리되지 않는 코드에서 관리되는 대리자를 호출하는 중

이상적으로, 내가 원하는 것은 단순히 C#에서 (대리 호출을 메서드 호출과 동일한 구문을 사용하여 호출하는 것처럼) 대리자를 호출하는 것이지만 비 관리 코드에서 호출하는 것입니다. 나는 이것을 할 수있는 방법이나 그것이 가능할지라도 알 수 없다.

이렇게 할 수 있습니까? 그렇다면 어떻게해야합니까? 이벤트를 사용하고 비 관리 코드에서 이벤트를 발생시켜야합니까?

이것은 내가하고 싶은 것입니다. 관리 측면에서

(이 C를 관리 ++)

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public delegate void CallbackMethod(); 

[ComVisibleAttribute (true)] 
[InterfaceTypeAttribute(ComInterfaceType::InterfaceIsIUnknown)] 
[GuidAttribute("CD305837-98FC-4433-A195-BD50C6C16369")] 
public interface class ICallback 
{ 
    void QueueCallback(CallbackMethod^ callBack); 
}; 

그리고, ICallback 인터페이스를 구현하는 관리되지 않는 클래스 :

HRESULT CIoComplectionPort::QueueCallback(_CallbackMethod * callBack) 
{ 
    // How is the callBack method invoked here? 
} 

답변

4

함수 포인터를 허용하는 함수를 내 보내면됩니다. C# 코드는 대리자 객체를 전달하여 호출 할 수 있습니다. pinvoke marshaller는 Marshal.GetFunctionPointerForDelegate()와 동일한 작업을 수행합니다. 위임자의 대상 및 메서드를 저장하는 스텁을 만듭니다. 그 스텁을 가리키는 함수 포인터.

C# 코드가 EnumWindows()처럼 pinvoke 할 때 똑같은 일이 발생합니다.

0

당신은 C++ \ CLI를 사용하여 작업을 수행 할 수 있습니다, C++ \ CLI를 사용하면 네이티브 C++에서 위임을 호출하는 C++ \ CLI 메서드를 호출하여 두 세계를 통신 할 수있는 브리지를 개발할 수 있습니다.

관련 문제