c#4.0 DLR和COM

时间:2012-02-18 18:20:25

标签: c# .net c#-4.0 dynamic-language-runtime

用于说明DLR的好处的一个常见示例是将其与遗留组件(如COM)一起使用,并且能够调用在编译时不可见的方法。

是否可以跳过COM Interop步骤?因为一旦组件被Regasm'd,编译器就会拥有元数据。

并且假设我们跳过Interop步骤,对COM签名的任何更改(由.net使用)仍然需要重新编译。

如果我不得不做出另一个猜测,DLR还提供了调用的缓存,因此任何后续调用应该比使用常规反射的调用更快..所以也许这是DLR的一个好处在这里..但语法上我是只是没有看到它..

2 个答案:

答案 0 :(得分:2)

  

是跳过COM Interop步骤的重点吗?

不是,它只是简化了方法的调用,这对于反射而言可能非常痛苦。无论您使用Reflection还是C#4.0 dynamic,都使用Interop与非托管代码进行通信。

  

并且假设我们跳过Interop步骤,对COM进行任何更改   签名(由.net使用)仍然需要重新编译。

这取决于。如果重命名COM方法,则需要重新编译.NET调用代码,因为当您尝试调用不存在的方法时,它将在运行时中断。

答案 1 :(得分:1)

与后期COM交互特别有用。您没有添加对COM类型库或PIA的引用的类型。在动态关键字可用之前,在C#中非常痛苦,它需要反射代码。如果你有一个类型库,那么你几乎总是想要使用它,因为它是 lot 更快,在编译时捕获错误并支持IntelliSense。您不希望使用的唯一原因是当您尝试使代码足够灵活以处理不同版本的COM服务器时。然而,运行时异常总是在拐点处破坏你的一天,这是非常危险的。实际上很少有没有类型库,几乎所有的COM组件作者都提供了一个类型库,因为它的优点是如此之大。

Regasm正好相反,你只能在C#中编写自己的[ComVisible]服务器时使用它。那时动态没有任何好处。