Finalizar componentes em .NET 3.5 no COM+
-
sexta-feira, 8 de agosto de 2008 14:11
Pessoal,
Tenho um componente no COM+ implementado em .NET 3.5, o componente quando acessado por "client" em .NET 2.0, 3.0 e 3.5 os componentes são acessados e liberados corretamente, porém quando acesso com um "client" em .NET 1.1 os componentes são executados mas não finalizam (Objects e Activation são incrementados a cada chamada), "travando os componentes" após muitas execuções. Alguém sabe como solucionar esse problemas? Abaixo o código que estou utilizando:
Componente:
using
System;using
System.Collections.Generic;using
System.Linq;using
System.Text;using
System.EnterpriseServices;using
System.Runtime.InteropServices;namespace
CompTestNet{
public interface IMyInterface
string test();{
}
[
MustRunInClientContext(false)][
EventTrackingEnabled(true)][
JustInTimeActivation(true)][
Guid("7858F108-07D3-4f0e-8115-76928EEB7B08")][
ComponentAccessControl(false)] public class CompTestNet : ServicedComponent, IMyInterface{
public string test(){
string retorno = ""; try{
EventLog.WriteEntry("Teste", "Execu‡ão de Componentes .NET 3.5"); ContextUtil.DeactivateOnReturn = true;System.Diagnostics.
retorno =
"OK";}
catch (Exception ex){
EventLog.WriteEntry("Teste", ex.Message);System.Diagnostics.
retorno =
"NOK";}
return retorno;}
}
}
Client (button):
private void button1_Click(object sender, System.EventArgs e){
object oActivator; object retorno;Type oTipo;
oTipo = Type.GetTypeFromProgID("CompTestNet.CompTestNet");
oActivator = Activator.CreateInstance(oTipo);
null,oActivator,null);retorno = oTipo.InvokeMember("test",BindingFlags.Default | BindingFlags.InvokeMethod,
MessageBox.Show(retorno.ToString());
if (oActivator != null){
if (oActivator is IDisposable){
// tentativas para finalizar o objeto
null;GC.Collect();
((IDisposable)oActivator).Dispose();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oActivator);
oActivator =
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
}
Todas as Respostas
-
sexta-feira, 8 de agosto de 2008 18:34
Acho que é um bug do c#.
Uma vez tive que usar isto pra tirar uma dll do excel da memoria:
System.Diagnostics.Process [] PROC = Process.GetProcessesByName("EXCEL");
foreach(System.Diagnostics.Process PK in PROC)
{
if(PK.MainWindowTitle.Length==0)
PK.Kill();
} -
segunda-feira, 11 de agosto de 2008 18:50
Skynyrd,
Obrigado pelo retorno, mas acredito que não seja um bug do C# pois o mesmo problema ocorre com o VB.Net tbém. Referente ao código não posso utilizá-lo porque o processo é um DLLHost. Vou continuar pesquisando...
Abraços.
Obrigado.

