加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在Win32本机函数中使用Marshal.ReleaseComObject

发布时间:2020-12-15 07:59:41 所属栏目:百科 来源:网络整理
导读:我正在玩这两个本机win32函数: [DllImport( "oleacc.dll" )] public static extern int AccessibleObjectFromWindow( IntPtr hwnd,int dwObjectID,ref Guid refID,ref Accessibility.IAccessible ppvObject ); [DllImport( "oleacc.dll" )] public static e
我正在玩这两个本机win32函数:
[DllImport( "oleacc.dll" )]
    public static extern int AccessibleObjectFromWindow(
            IntPtr hwnd,int dwObjectID,ref Guid refID,ref Accessibility.IAccessible ppvObject );
    [DllImport( "oleacc.dll" )]
    public static extern uint AccessibleChildren(
        Accessibility.IAccessible paccContainer,int iChildStart,int cChildren,[Out] object[] rgvarChildren,out int pcObtained );

而且我很难搞清楚我是否应该/需要在任何返回的对象上调用Marshal.ReleaseComObject.我很感激有人可以开导我这个话题!这是一个示例用法:

Accessibility.IAccessible test(
        int hWnd,string accessName )
    {
        Guid guidCOM = new Guid( 0x618736E0,0x3C3D,0x11CF,0x81,0xC,0x0,0xAA,0x38,0x9B,0x71 );
        Accessibility.IAccessible a = null;

        AccessibleObjectFromWindow(
            new IntPtr( hWnd ),-4,ref guidCOM,ref a );
        object[] children = new object[a.accChildCount];
        int z;
        AccessibleChildren( a,children.Length,children,out z );
        foreach ( Accessibility.IAccessible a2 in children )
            try
            {
                if ( a2.get_accName( 0 ) == accessName )
                    return a2;
            }
            catch
            {
            }
        return null;
    }

解决方法

Marshal.ReleaseComObject是一个非常有用的解决方法,如果你真的需要让GC立即应用发布,而不是等待GC运行.除非你真的需要,否则最好不要使用它,因为它倾向于接管你的代码而你必须在每个地方都应用它,包括你创建隐式引用的地方.

我怀疑.Net中COM互操作的最佳方法是围绕您正在使用的方法编写强类型包装类.这样就不可能引入隐式引用,它将简化代码并确保GC更容易访问接口.我的一些牛人通过使用这种方法报告了更好的记忆行为 – 当GC运行时,对象被及时释放,而不会留下任何神秘的参考.

一般来说,.Net代码中引用的所有COM对象都以RCW对象的形式实现,该对象保存真正的COM引用 – 对ReleaseComObject的调用强制RCW将引用减少一个计数.这样,它就像在实际的IUnkown实例上调用Release一样.可能在上面的示例中,没有必要拨打电话.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读