Вы можете настроить некоторую инфраструктуру IPC между ними. Один из способов сделать это - сделать вашу DLL COM-совместимой. Т.е. наличие DLL будет COM-сервером для некоторого COM-класса. Затем серверный процесс создаст класс CreateInstance, который автоматически запустит ваш собственный процесс. Тогда вызов будет просто обычным вызовом функции, COM будет обрабатывать RPC.
Другим более простым способом будет использование именованного файла с отображением в памяти. Оба процесса откроют дескриптор этого, там вы можете хранить очередь или некоторую структуру данных. Процесс сервера будет выдвигаться, пока всплывает собственный процесс. Вы можете использовать события Windows для синхронизации этого. Вы можете написать это самостоятельно или использовать что-то вроде boost :: interprocess для C ++. Я предполагаю, что могут быть другие библиотеки IPC, которые вы можете найти для этого.
Вы также можете использовать трубу, я знаю, что в C # есть несколько простых способов обработки труб Windows. Каналы не нуждаются в синхронизации, но для эффективной обработки ряда таких запросов может потребоваться несколько потоков в собственном процессе для чтения из канала.
Лично я бы использовал COM, если это возможно. Поскольку это будет скрывать для вас низкоуровневые вещи IPC, которые могут быть провалом. Это немного дольше, чтобы установить.