首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理包装IDispatch COM接口的c#接口

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

Stack Overflow用户
提问于 2012-03-06 01:59:22
回答 1查看 291关注 0票数 2

我已经在C#中实现了一个IDispatch接口。它又打开了一个非托管COM接口,该接口还公开了一个IDispatch接口。

代码语言:javascript
复制
    ~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,同时使用对象,这意味着以后尝试访问包装的接口会失败。当我删除清理代码时,代码运行良好,但当使用代码的程序退出时将失败(我没有调用应用程序的调试信息,但很可能是包装的接口尚未释放)。我对如何解决这个问题感到困惑,并认为我的理解是错误的。任何建议都将不胜感激。

该对象的初始化方式如下:

代码语言:javascript
复制
    private void InitialiseObject()
    {
        if (so == null)
        {
            so = Activator.CreateInstance(Type.GetTypeFromProgID("MyProgID));
        }
    }

然后像这样使用:

代码语言:javascript
复制
    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接口的信息。

EN

回答 1

Stack Overflow用户

发布于 2012-03-06 02:04:59

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9571519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档