Лучший способ убить из процесса dll ('dllhost.exe' 'COM Surrogate'), когда приложение выходит?

Я использую метод "DllSurrogate", чтобы позволить 64-битному C# exe общаться с 32-битным C# dll. Этот метод описан в разделе "Хостинг.NET DLL в качестве внепроцессного COM-сервера (EXE)".

Когда приложение запускает дополнительный процесс с именем "dllhost.exe *32", он автоматически отображается в диспетчере задач с описанием "COM Surrogate". Это связь между приложением и 32-битной DLL.

У меня проблема в том, что этот процесс не завершается при выходе из приложения. Может кто-нибудь предложить рекомендуемый способ борьбы с этим?

Я мог бы найти процесс и убить его, когда мое приложение закрывается, но мне нужно убедиться:

  • Это мой "Суррогат COM", а не принадлежащий другому приложению.
  • Он не используется другим запущенным экземпляром моего приложения.

Есть ли более прямая связь между моим приложением и этим процессом, которую я могу проверить?

1 ответ

Решение

Суррогат COM, который отказывается прекратить, обычно указывает на выдающиеся ссылки на CoClass или ресурсы, которые еще не были выпущены. Вы можете добиться освобождения, прибегнув к ReleaseComObject или же FinalReleaseComObject, Однако при использовании этого подхода вы должны знать о связанных рисках, как описано здесь.

Если вы все еще не видите другого способа, кроме ручного завершения суррогата COM, вам нужно перечислить все dllhost.exe процессы на вашей машине. Извлеките командную строку каждого кандидата и найдите /ProcessId аргумент. Если это соответствует GUID вашей CoClass тогда вы нашли совпадение.

Другие вопросы по тегам