Windows Image Acquisition和COM

时间:2015-11-01 09:06:33

标签: c# com wia

我正在尝试使用WIA扫描,我看到C#代码示例包含" dynamic"键入并使用COM对象创建,例如

set Img = CreateObject("WIA.ImageFile")

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

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

ImageFile img = new ImageFile()

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

当您使用WIA时,这不是一个非常有用的优势,它在过去10年中保持稳定。微软曾经发布过针对Windows XP的WIA v2的后端版本,但已经停产。如果您仍然想要支持XP,那么使用后期​​绑定,这样您仍然可以选择WIA v1。别这么做。

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