Мы очень сильно пострадали от этого. Лучше не пытаться загружать слишком много ссылок взаимодействия в среду выполнения .Net. Кроме того, вы можете использовать Marshal.ReleaseComObject
API, если вам нужно что-то выпустить прямо сейчас.
Другим хорошим методом является рефакторинг клиентского кода для использования безопасных типов вокруг кода взаимодействия - если в вашем коде есть известная ссылка на каждый RCW взаимодействия, это увеличивает вероятность того, что ссылка взаимодействия будет GCed своевременно. Основная проблема, которую мы стремимся избежать, - это проблема «слишком много точек»:
foo.bar.quux.xyzzy.groo(); // where foo, bar, quux and xyzzy are all COM references
Каждый из объектов между точками в вышеприведенном коде эффективно просочился (вероятно, не в долгосрочной перспективе), поскольку у нас есть неявная ссылка на экземпляр. Вам потребуется создать именованные ссылки на каждый из экземпляров, чтобы иметь хороший шанс на их очистку:
Foo foo;
Bar bar=foo.bar;
Quux quux=bar.quux;
Xyzzy xyzzy=quux.xyzzy;
xyzzy.groo();
Теперь возможно использовать среду выполнения для освобождения ссылки:
ReleaseComObject(xyzzy); // etc...