У меня есть два приложения, оба из которых я написал.AppA была написана на C ++ с использованием MFC.Во время запуска он регистрирует CSingleDocTemplate и создает документ.Документ предоставляет интерфейс COM и регистрируется в ROT:
LPUNKNOWN punk = GetInterface(&IID_Welder); // doesn't AddRef
::RegisterActiveObject(punk, CLSID_Interface, ACTIVEOBJECT_WEAK, &m_dwRegister);
AppA отзывает запись в ROT, когда она уничтожена:
if (m_dwRegister)
::RevokeActiveObject(m_dwRegister, NULL);
Деструктор вызывается только когда AppAпрекращается.
AppB написан на C # и является клиентом интерфейса, предоставляемого AppA:
private void Connect()
{
welderInterface = (Welder.Interface)Marshal.GetActiveObject("Welder.Interface");
Marshal.GetIUnknownForObject(welderInterface); // AddRef's it ...
}</p>
<p>private void Disconnect()
{
if (welderInterface != null)
{
Marshal.ReleaseComObject(welderInterface);
welderInterface = null;
}
}
(обработка ошибок для ясности опущена)
Это все работает отлично при первом запуске AppB послеAppA запущено;AppB может вызывать Connect
и Disconnect
так часто, как хочет, и использовать интерфейс между ними.Однако, если AppB завершает работу и запускается снова (AppA все еще работает), интерфейс больше не доступен - Marshal.GetActiveObject
выдает исключение из MK_E_UNAVAILABLE
.Единственный способ сделать интерфейс снова доступным - перезапустить AppA - не приемлемое решение!
Может кто-нибудь подсказать, как я могу это исправить?