Лучший способ очистить COM-объект в приложении .net - PullRequest
1 голос
/ 06 сентября 2010

Я работаю над приложением Windows .Net, которое внутренне использует COM DLL. Из следующих 4 способов освобождения COM-объекта, который является лучшим?

1.
 if (obj != null)
                {
                    Marshal.ReleaseComObject(obj);
                }

2.
 if (obj != null)
                {
                    Marshal.ReleaseComObject(obj);
                    obj=null;
                }


3.if (obj != null)
                {
                    Marshal.FinalReleaseComObject(obj);
                }


4.if (obj != null)
                {
                    Marshal.FinalReleaseComObject(obj);
                    obj=null;
                }

Спасибо за чтение.

Ответы [ 2 ]

2 голосов
/ 06 сентября 2010

Либо просто позвольте GC разобраться с этим, как предложил Ричард, либо с вашим номером 2. Если вы позвоните FinalReleaseComObject, вы уничтожите вызываемую оболочку времени выполнения, независимо от того, найден ли он и в других частях вашего кода.Это может серьезно запутать другие части вашего кода.Поэтому вы должны вызывать ReleaseComObject только один раз за переход в .NET-land-from-COM.

2 голосов
/ 06 сентября 2010

5. Пусть GC сделает это.

Это нормально, если компонент COM не удерживает необходимые вам значительные ресурсы.


Если вы основываете свой подход на проверке obj != null, то установка obj на null будет хорошей идеей, если только вы не уверены, что этот код не будет вызываться несколько раз.

Способ лучший : необходимо больше подробностей о реализации вашего приложения, чтобы дать конкретный совет между использованием ReleaseComObject и FinalReleaseComObject, но в идеале ответ будет ни .

...