Windows message pumb / Dispatcher / RealProxy
Not so long ago I had to integrate a COM component into an application. The catch was the application had no Windows message pumb and the COM component uses exactly this message pumb for some communications.
So I need to create a thread with its own message pumb and then dispatch the calls to the component to the thread holding this message pumb.
Creating a thread is simple and quickly done.
Now to send all calls of the component to the correct class I could either wrap every method and property call with dispatcher.Invoke or I can use the RealProxy type to wrap all calls in one place.
Now I can use the MessagePumpProxy with my COM wrapper like the following.
So I need to create a thread with its own message pumb and then dispatch the calls to the component to the thread holding this message pumb.
Creating a thread is simple and quickly done.
_thread = new Thread(RunThread)
{
Name = nameof(MessagePumpDispatcher),
IsBackground = true
}
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
And to start a new message pumb I can use the Dispatcher type.
_dispatcher = Dispatcher.CurrentDispatcher;
try
{
Dispatcher.Run();
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
}
Dispatching work to this thread can be achieved by using the Invoke method on the Dispatcher._dispatcher.Invoke(action);This is the whole class.
Now to send all calls of the component to the correct class I could either wrap every method and property call with dispatcher.Invoke or I can use the RealProxy type to wrap all calls in one place.
Now I can use the MessagePumpProxy with my COM wrapper like the following.
var com = MessagePumpProxy<IComponentWrapper>.Create(new ComponentWrapper()); com.DoSomething();The ComponentWrapper type is just a small wrapper for the COM component.
public interface IComponentWrapper
{
void DoSomething();
}
public class ComponentWrapper : MarshalByRefObject, IComponentWrapper
{
public void DoSomething()
{
// call com component
}
}
For more information about the RealProxy type you can read this blog post.
Comments
Post a Comment