none
Finalizar componentes em .NET 3.5 no COM+ RRS feed

  • Pergunta

  •  

    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

    {

    System.Diagnostics.EventLog.WriteEntry("Teste", "Execu‡ão de Componentes .NET 3.5");

    ContextUtil.DeactivateOnReturn = true;

    retorno = "OK";

    }

    catch (Exception ex)

    {

    System.Diagnostics.EventLog.WriteEntry("Teste", ex.Message);

    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);

    retorno = oTipo.InvokeMember("test",BindingFlags.Default | BindingFlags.InvokeMethod,null,oActivator,null);

    MessageBox.Show(retorno.ToString());

    if (oActivator != null)

    {

    if (oActivator is IDisposable)

    {

    // tentativas para finalizar o objeto

    GC.Collect();

    ((IDisposable)oActivator).Dispose();

    System.Runtime.InteropServices.Marshal.ReleaseComObject(oActivator);

    oActivator = null;

    GC.WaitForPendingFinalizers();

    GC.Collect();

    }

    }

    }

     

    sexta-feira, 8 de agosto de 2008 14:11

Todas as Respostas

  • 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();
                }

    sexta-feira, 8 de agosto de 2008 18:34
  • 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.

     

    segunda-feira, 11 de agosto de 2008 18:50