C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了有什么方法可以避免在只需要几个方法时创建一个巨大的C#COM接口包装器?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问候所有,

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

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

一个选择是使用COR_270_11845@Import属性来声明相关接口并通过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中)中出现的顺序完全相同.

大佬总结

以上是大佬教程为你收集整理的有什么方法可以避免在只需要几个方法时创建一个巨大的C#COM接口包装器?全部内容,希望文章能够帮你解决有什么方法可以避免在只需要几个方法时创建一个巨大的C#COM接口包装器?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。