Для того, чтобы сделать это, вы должны сначала установить способ получить конкретный вызов в определенном потоке. .Net имеет несколько встроенных механизмов для этого, но я считаю, что самым простым является класс SynchronizationContext. И WinForms, и WPF устанавливают экземпляр SynchronizationContext для любого потока, в котором они выполняют цикл обработки сообщений.
Так я бы ...
- Создать новую тему для объекта
- Создайте скрытое окно WinForms или WPF и запустите его
- Получение SynchronizationContext для этого потока
- Создать объект COM в этом потоке
Теперь у вас есть местоположение для COM-объекта и средства для обратного вызова в нужном потоке. Следующим шагом будет создание прокси-объекта. Этот объект должен иметь все методы для объекта COM (и, возможно, просто реализовать интерфейс COM). Затем он будет принимать каждый вызов метода и прокси-вызов для реального COM-объекта, используя контекст синхронизации.
public class Foo {
private ComFoo _com;
private SynchronizationContext _context;
public void Bar() {
_context.Send(notUsed => _com.Bar(););
}
}