2012-02-18 33 views
1

一個常見的例子來說明DLR的好處是將其與遺留組件(如COM)一起使用,並且具有調用在編譯時不可見的方法的能力。c#4.0 DLR和COM

是否可以跳過COM Interop步驟?因爲一旦組件被Regasm'd編譯器將具有元數據。

假設我們跳過了Interop步驟,對COM簽名(由.net使用)的任何更改仍然需要重新編譯。

如果我不得不作出另一個猜測,DLR也提供緩存的調用,所以任何後續調用應該比那些使用正則反射更快..所以也許這是DLR的一個好處在這裏..但語法上我'米只是沒有看到它..

回答

1

這對於與後期COM進行互操作特別有用。您不添加對COM類型庫或PIA的引用的類型。非常痛苦的做在C#之前動態關鍵字變得可用,它需要反射代碼。如果你有一個類型庫,那麼你幾乎總是想要使用它,因爲它的速度更快,在編譯時捕獲錯誤並支持智能感知。你不想使用它的唯一原因是當你試圖讓你的代碼具有足夠的靈活性來處理不同版本的COM服務器時。然而,運行時異常總是在即將毀掉你的一天,這是相當危險的。事實上,沒有類型庫是很少見的,幾乎所有的COM組件作者都提供了一個,因爲它的優點如此之大。

Regasm正好相反,你只有在你用C#編寫自己的[ComVisible]服務器時纔會使用它。然後動態沒有好處。

+0

我看..所以一些組件不提供regasm做它的工作所需的元數據? – 2012-02-18 18:36:10

+0

它與Regasm沒有任何關係,只有Tlbimp工具與此相關。是的,COM中的類型庫是可選的。腳本語言從不使用一種語言。 – 2012-02-18 18:38:29

2

是這個點以跳過COM互操作步驟?

不是,它只是簡化了方法的調用,這可能對Reflection很痛苦。無論您使用Reflection還是C#4.0動態,都使用Interop與非託管代碼進行通信。

假設我們跳過了Interop步驟,對COM 簽名(即.net使用的)的任何更改仍需要重新編譯。

這取決於。如果您重新命名COM方法,則需要重新編譯.NET調用代碼,因爲在嘗試調用不存在的方法時,它會在運行時中斷。

+0

對,但是使用互操作,您不需要編寫任何反射代碼,因爲.net包裝類是由Regasm.exe生成的 – 2012-02-18 18:26:47

+0

@SonicSoul,絕對是。這就是爲什麼它是調用COM組件的首選方法。 – 2012-02-18 18:27:57

+0

那麼DLR帶來了什麼? – 2012-02-18 18:30:21