作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在玩弄这两个 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/
我是一名优秀的程序员,十分优秀!