Windows Runtime (WP 8) вне компонента процесса и события создания / подписки
Я сделал внепроцессный компонент WR/WP8 с собственным фоновым потоком. Он обрабатывает стек SIP внутри и работает в фоновом потоке. Это модифицированный код из примера ChatterBox MSDN. https://code.msdn.microsoft.com/windowsapps/ChatterBox-VoIP-sample-app-b1e63b8b
В последние дни я добавляю делегатов для поднятия событий из компонента. В C++/CX это:
public delegate void OnLogMessage(Platform::String^ msg);
public ref class Logger sealed
{
public:
Logger();
virtual ~Logger();
void FlushLog();
event OnLogMessage^ OnLogMessage;
};
Существует подписка на событие в коде C#:
BackgroundProcessController.Instance.Logger.OnLogMessage += new IntTalk.OnLogMessage(mLogger_OnLogMessage);
Строит нормально.
Но во время отладки я вижу исключение:
A first chance exception of type 'System.Exception' occurred in mscorlib.ni.dll
Additional information: Interface not registered (Exception from HRESULT: 0x80040155)
If there is a handler for this exception, the program may be safely continued.
DLL прокси заглушки генерируется. Я проверил файлы.h /.c - они содержат код для событий.
Что может быть причиной этой проблемы?
1 ответ
При отладке в основном режиме того же кода я наблюдал исключение "Интерфейс не зарегистрирован". Короткий поиск привел к этой ссылке:
Ошибка "Интерфейс не зарегистрирован" на внешнем интерфейсе обратного вызова ATL
Но я использую C++/CX, вообще не IDL. Я проверил демонстрацию ChatterBox (которая была отправной точкой для моего приложения VoIP) - они вообще не используют события среды выполнения Windows.
Поэтому я прекратил свои попытки в этом направлении.
Другими возможными способами могут быть:
- использовать очередь пользовательских структур событий, опрашивать и обрабатывать это событие со стороны C#.
- использовать интерфейс, объявленный в C++/CX, в качестве обработчика событий. Реализуйте этот интерфейс на стороне C#. Однако не уверен, будет ли он маршаллизовать события в основной поток пользовательского интерфейса.