Windows图像采集和COM

本文关键字:COM 图像 Windows | 更新日期: 2023-09-27 18:20:09

我正在尝试WIA扫描,我看到了包括"动态"键入和使用COM对象创建的C#代码示例,例如

set Img = CreateObject("WIA.ImageFile")

dynamic imageFile = dialog.ShowAcquireImage(
                    WiaDeviceType.Scanner,...

这种方法是因为这些例子是针对脚本语言的吗(我对COM了解不多)?即,如果我在WPF应用程序中使用它,我可以毫无问题地使用WIA类吗?还是应该(必须)使用COM?

ImageFile img = new ImageFile()

谢谢。

Windows图像采集和COM

第一个片段是Basic,它肯定使用了后期绑定。第二个片段是C#,它使用了一个非常奇怪的混合,其中ImageFile返回类型是后期绑定的,但"WiaDeviceType.Scanner"似乎肯定来自WIA类型库。总的来说,混合没有多大意义。要么对类型库进行依赖,要么将其完全延迟绑定。

类型库与.NET程序集中的元数据完全等效。它是COM组件支持的类型的机器可读描述。就像您使用Project>AddReference添加对.NET程序集的引用一样,您也可以对类型库执行完全相同的操作。您可以在COM选项卡中获得注册类型库的列表。您可以选择"Microsoft Windows Image Acquisition Library v2.0"。或者使用"浏览"按钮,类型库通常嵌入在DLL中,就像元数据嵌入在.NET程序集中一样,有时它是一个单独的.tlb文件。在您的情况下,您可以选择c:''windows''system32''wmp.dll。有时,您必须使用Tlbimp.exe自己转换类型库,这在转换生成警告时是必要的。

延迟绑定COM服务器完全等同于在.NET中使用反射。在C#版本4之前,它看起来也很像反射,非常痛苦。它具有使用反射的所有缺点,没有IntelliSense帮助,键入错误会产生运行时错误,并且在运行时效率低下。它有一个优点,和反射一样,它对版本更改更有弹性。

当你使用WIA时,这不是一个非常有用的优势,它在过去的10年里一直是稳定的。微软曾发布一个用于Windows XP的WIA v2的后端口版本,但该版本已停止。如果你仍然想支持XP,那么可以选择使用后期绑定,这样你仍然可以笨拙地使用WIA v1。不要那样做。

长话短说,你肯定更喜欢使用项目>添加引用。编写代码要容易得多,而且不太可能处理难以理解的运行时错误。