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

有什么方法可以避免在只需要几个方法时创建一个巨大的C#COM接口

发布时间:2020-12-16 09:27:54 所属栏目:百科 来源:网络整理
导读:问候所有, 我正在开发一个C#程序,它需要能够在Windows 7 Explorer的新ItemsView控件中获取热门项目的索引.幸运的是,Microsoft has provided a way通过UI自动化,通过查询控件的自定义属性来完成此操作. 不幸的是,System.Windows.Automation命名空间莫名其妙地
问候所有,

我正在开发一个C#程序,它需要能够在Windows 7 Explorer的新ItemsView控件中获取热门项目的索引.幸运的是,Microsoft has provided a way通过UI自动化,通过查询控件的自定义属性来完成此操作.

不幸的是,System.Windows.Automation命名空间莫名其妙地似乎没有提供查询自定义属性的方法!这使我不得不完全抛弃C#Automation命名空间并仅使用非托管COM版本.一种方法是将所有自动化代码放在一个单独的C/C++LI模块中,并从我的C#应用??程序中调用它.但是,如果可能的话,我想避免使用此选项,因为它会为我的项目添加更多文件,而且我不得不担心32/64位问题等等.

另一个选择是使用ComImport属性来声明相关接口并通过COM-interop完成所有操作.这就是我想做的.但是,相关的接口,如IUIAutomation和IUIAutomationElement,正在变得更加巨大.他们总共有数百种方法,参考吨和大量的接口(我假设我还必须声明),几乎所有这些都是我永远不会使用的.我不认为UI自动化接口也在任何类型库中声明,所以我不能使用TLBIMP.

有什么方法可以避免手动将bajillion方法签名转换为C#,而只是声明我实际需要的十个左右的方法吗?我看到C#4.0添加了一个新的“动态”类型,可以缓解COM互操作;那与我的问题有关吗?

谢谢

解决方法

最重要的是(从C#调用COM方法的角度来看)方法以正确的顺序出现在界面中.如果你没有使用某个方法,你可以将它声明为无效并且不会发生任何不好的事情(除非你实际调用它!).这样您就不必编写正确的签名并定义所有其他类型等.例如,

[ComImport,Guid("30cbe57d-d9d0-452a-ab13-7ac5ac4825ee"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IUIAutomation
{
    void CompareElements();
    void CompareRuntimeIds();
    void GetRootElement();
    // 50 or so other methods...
    // ... define only the signatures for the ones you actually need
}

这些方法的定义应与它们在UIAutomationClient.h(在Windows SDK中)中出现的顺序完全相同.

(编辑:李大同)

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

    推荐文章
      热点阅读