处理包装IDispatch COM接口的c#接口

时间:2012-03-05 17:59:22

标签: c# com interface

我在C#中实现了一个IDispatch接口。它反过来打开一个非托管COM接口,它也暴露了一个IDispatch接口。

    ~MyObject()
    {
       Logger.TraceDebug("About to clean up object");
       CleanupObject();
    }


    private void CleanupObject()
    {
        lock (lock_so)
        {
            try
            {
                if (so != null)
                {
                    Logger.TraceWarning("Releasing object");
                    Marshal.FinalReleaseComObject(so);
                }

            }
            catch (Exception e)
            {
            }
            so = null;
        }

    }

我遇到的问题是在正常执行期间使用对象时调用Finalize意味着稍后尝试访问包装的接口失败。当我取出清理代码时,代码工作正常但是当使用代码的程序退出时会失败(我没有来自调用应用程序的调试信息,但它可能是包装的接口尚未处理)。我不知道如何解决这个问题,并认为我的理解是不正确的。任何建议将不胜感激。

该对象在以下内容中初始化:

    private void InitialiseObject()
    {
        if (so == null)
        {
            so = Activator.CreateInstance(Type.GetTypeFromProgID("MyProgID));
        }
    }

然后使用:

    public void DoSomething(string String)
    {
        try
        {
            lock (lock_so)
            {
            Object[] args = new Object[1];
            args[0] = String;
            so.GetType().InvokeMember("DoSomething", BindingFlags.InvokeMethod, null, so, args);
            }
        }

所有这一切的重点是c#接口充当传递类,并且能够记录从第三方应用程序传递到IDispatch接口的信息。

1 个答案:

答案 0 :(得分:0)

你为什么需要这个?如果我有你,我将有一个dispose方法来释放一些资源,那么我将实现IDisposable接口。 Pattern