Windows 图像采集和 COM

Windows Image Acquisition and COM

我正在试验 WIA 扫描,我看到了 C# 代码示例,其中包括 "dynamic" 键入和使用 COM 对象创建,例如

set Img = CreateObject("WIA.ImageFile")

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

那个方法是因为示例是针对脚本语言的吗(我对COM了解不多)?也就是说,如果我在 WPF 应用程序中使用它,我可以只使用 WIA 类 没有任何问题,还是我应该(我必须)使用 COM?

ImageFile img = new ImageFile()

谢谢。

第一个片段是 Basic,它肯定使用了 late-binding。第二个片段是 C#,它使用了一种非常古怪的组合,其中 ImageFile return 类型是后期绑定的,但 "WiaDeviceType.Scanner" 显然来自 WIA 类型库。一般来说,混合没有多大意义。您要么依赖类型库,要么将其完全后期绑定。

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

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

这不是一个优势,当你使用 WIA 时非常有用,它在过去 10 年里一直很稳定。 Microsoft 过去曾为 Windows XP 发布 WIA v2 的向后移植版本,但已停产。如果您仍然想支持 XP,那么使用后期​​绑定这样您仍然可以使用 WIA v1 是一个选项。不要那样做。

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