Dan*_*röm 7 .net c# com interop
我正在玩这两个原生的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 );
Run Code Online (Sandbox Code Playgroud)
而且我很难搞清楚我是否应该/需要在任何返回的对象上调用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;
}
Run Code Online (Sandbox Code Playgroud)
Marshal.ReleaseComObject如果你真的需要让GC立即应用发布,而不是等待GC运行,那么这是一个有用的解决方法.除非你真的需要,否则最好不要使用它,因为它倾向于接管你的代码而你必须在每个地方都应用它,包括你创建隐式引用的地方.
我怀疑.Net中COM互操作的最佳方法是围绕您正在使用的方法编写强类型包装类.这样就不可能引入隐式引用,它将简化代码并确保GC更容易访问接口.我的一些牛人通过使用这种方法报告了更好的记忆行为 - 当GC运行时,对象会及时释放,而不会留下任何神秘的参考.
一般来说,.Net代码中引用的所有COM对象都是以RCW对象的形式实现的,该对象保存真正的COM引用 - ReleaseComObject强制RCW将引用递减计数为1 的调用.这样就类似于只调用Release实际的IUnkown实例.可能在上面的示例中,没有必要拨打电话.
| 归档时间: |
|
| 查看次数: |
4821 次 |
| 最近记录: |