2010-06-15 2 views
2

У меня есть COM-объект, который мы вызываем из C#. Это отлично работает, и у меня есть свой собственный пул объектов, которые я могу использовать, когда захочу. Теперь мне нужно убить объект. Я попытался выпустить объект COM явно, а затем собрать мусор из другого потока, но это ничего не делает. У кого-нибудь есть другие идеи, чтобы убить этот объект? Спасибо за помощь.Killing COM object from C#

Я попытался

System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
myApp = null; 

и создать его

myApplication.ApplicationClass myApp = new myApplication.ApplicationClass(); 

это полный код этот объект ком написано в VB6, ниже является C# код, вызывающий VB6 компонент

 myApplication.ApplicationClass myApp = new myApplication.ApplicationClass(); 

     string user = this._User; 
     string pass = this._Pass; 
     string company = this.companyNumber; 

     try 
     { 
      if (myApp.Login(ref user, ref pass, ref company)) 

{ // Выполнение некоторых мер } else { throw new System.Exception (MESSAGE_LOGINERROR); } } И наконец { System.Runtime.InteropServices.Marshal.ReleaseComObject (myApp);

  GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      M2MApp = null; 

}

Спасибо, Прадипом

+0

С какой библиотеки 'ApplicationClass'? Это оболочка microsoft excel/word, заключенная под ней? – shahkalpesh

+0

Это не компонент excel или word, это активная x dll, созданная мной. – Pradeep

+0

Опубликуйте код VB6, который обращается к базе данных VFP. Это может быть ваш код VB6, который блокирует DB, а не проблему с конца .net. – shahkalpesh

ответ

0

Убедитесь, у вас нет какой-либо другой переменной со ссылкой (держащего ссылка) на myApp.

В качестве альтернативы, вызов FinalReleaseComObject также может быть полезен.
Примечание: Я рассмотрел документы &, предлагая это в качестве альтернативы. Используйте свое усмотрение при вызове этого метода.

+0

Нет переменной, ссылающейся на myApp – Pradeep

+0

Пожалуйста, напишите полный код (если можете) или пример приложения, чтобы выяснить, почему экземпляр COM не выпущен? к чему относится объект COM? какой тип (написанный на vb6/vC++/delphi)? – shahkalpesh

+0

написано на vb6, код был размещен выше – Pradeep

1

возможно только поменяв две линии, потому что MYAPP IS ваша ссылка на Ваш объект: или пытаться повторять до нулевой:

while (System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp)>0) 
     ; 
myApp = null; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
+0

Обмен не помог. – Pradeep

+0

Извините, я всегда избавляюсь от этих объектов через ReleaseComObject. Кстати, вы называете «ReleaseComObject», пока он не вернет нуль? –

0

Я не имел подобную проблему в прошлом, и пытались все, что вы» но не смог его решить. В конце концов мне пришлось принудительно завершить мой процесс, чтобы убить COM-объект.

0

Для того, чтобы полностью освободить объект COM, вам необходимо загрузить его в отдельный AppDomain, который вы можете выгрузить после того, как вы вызвали ReleaseComObject() и выполнили другую надлежащую очистку для вашего объекта.

Это оказалось единственным надежным способом для меня в прошлом.