65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 4.0:COM Interop 改进

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2010年4月18日

CPOL

2分钟阅读

viewsIcon

22260

C# 4.0:COM interop 改进

动态解析以及命名参数和可选参数大大改善了与 COM API(例如 Office Automation 主互操作程序集 (PIA))进行互操作的体验。 但是,为了进一步减轻 COM Interop 的开发,C# 4.0 还添加了一些 COM 专属功能。

省略 ref

由于编程模型不同,许多 COM API 包含大量引用参数。 这些参数通常并非旨在改变传入的参数,而只是传递值参数的另一种方式。

专门针对 COM 方法,编译器允许声明方法调用,通过值传递参数,并将自动生成必要的临时变量来保存值,以便通过引用传递它们,并在调用返回后丢弃它们的值。 从程序员的角度来看,参数是通过值传递的。

这个方法调用

object fileName = "Test.docx";
object missing = Missing.Value;

document.SaveAs(ref fileName,
    ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing);

现在可以像这样编写

document.SaveAs("Test.docx",
    Missing.Value, Missing.Value, Missing.Value,
    Missing.Value, Missing.Value, Missing.Value,
    Missing.Value, Missing.Value, Missing.Value,
    Missing.Value, Missing.Value, Missing.Value,
    Missing.Value, Missing.Value, Missing.Value);

并且由于所有接收 Missing.Value 值的参数都将该值作为其默认值,因此方法调用的声明甚至可以简化为这样

document.SaveAs("Test.docx");

动态导入

许多 COM 方法接受并返回 variant 类型,这些类型在 PIA 中表示为 object。 在绝大多数情况下,调用这些方法的程序员已经从调用的上下文中知道了返回对象的 static 类型,但必须显式地对返回的值执行强制转换才能利用该知识。 这些强制转换非常常见,以至于构成了主要的麻烦。

为了简化开发人员的工作,现在可以导入 COM API,使 variants 改为使用 dynamic 类型表示,这意味着 COM 签名现在具有 dynamic 而不是 object 的实例。

这意味着现在可以轻松访问返回对象的成员或将其分配到强类型变量中,而无需强制转换。

而不是这段代码

((Excel.Range)(excel.Cells[1, 1])).Value2 = "Hello World!";

现在可以使用这段代码

excel.Cells[1, 1] = "Hello World!";

而不是这样

Excel.Range range = (Excel.Range)(excel.Cells[1, 1]);

可以使用这样

Excel.Range range = excel.Cells[1, 1];

索引和默认属性

C# 中仍然无法使用一些 COM interface 功能。 列表顶部是索引属性和默认属性。 如上所述,如果动态访问 COM 接口,这些功能将是可能的,但静态类型的 C# 代码无法识别它们。

没有 PIA - 类型等效性和类型嵌入

对于使用 PrimaryInteropAssemblyAttribute 标识的程序集,编译器将创建等效的类型(接口、struct、枚举和委托)并将它们嵌入到生成的程序集中。

为了减少生成的程序集的最终大小,只会生成和嵌入使用的类型及其使用的成员。

虽然这使得使用 COM 组件的应用程序的开发和部署更加容易,因为不需要部署 PIA,但仍然需要 COM 组件开发人员来构建 PIA

 

© . All rights reserved.