gpt4 book ai didi

c# - 如何将 Marshal.ReleaseComObject 与 Win32 native 函数一起使用

转载 作者:太空狗 更新时间:2023-10-29 20:26:10 25 4
gpt4 key购买 nike

我正在玩弄这两个 native 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, 0x0, 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, 0, 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 互操作的最佳方法是围绕您正在使用的方法编写强类型包装类。这样就不可能引入隐式引用,并且会简化代码并确保接口(interface)更容易被 GC 访问。我的一些同事报告说使用这种方法可以改善内存行为 - 对象在 GC 运行时及时释放,不会留下任何神秘的引用。

一般来说,.Net 代码中引用的所有 COM 对象都以 RCW 对象的形式实现,该对象拥有真正的 COM 引用 - 对 ReleaseComObject 的调用强制 RCW 将引用递减算一。通过这种方式,它类似于仅在实际的 IUnkown 实例上调用 Release。可能在您上面的示例中,没有必要进行调用。

关于c# - 如何将 Marshal.ReleaseComObject 与 Win32 native 函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com