共用方式為


遠端處理中的版本資訊

本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用 Windows Communication Foundation (WCF) 進行開發。

遠端處理主要用來處理強式名稱的組件。當強式名稱搭配遠端處理一起使用時,可適用下列基本規則:

  • 版本一律包含在 IMethodCallMessage 介面實作的 TypeName 屬性中。

  • 版本一律包含在 IConstructionCallMessage 介面實作的 ActivationTypeName 屬性中。

  • 版本一律與 TypeInfo 屬性一起儲存於 ObjRef 物件中。

  • 遠端處理中的其他所有版本設定是由使用中的格式器之 includeVersions 屬性所決定。根據預設,BinaryFormatter 物件會產生版本設定資訊,但是 SoapFormatter 物件則不會。此屬性可在建立通到時以程式設計方式來加以變更,或者可以透過遠端組態檔來加以設定。

本節將說明這些規則會如何影響物件參考以及遠端處理常用的各種啟動模型。

伺服器啟動物件

當用戶端連接至伺服器啟動 (或 <wellknown>) 物件時,伺服器會控制要啟動的型別版本。如果在設定好伺服器時仍未提供版本資訊,則當啟動物件時會使用最近的組件版本。例如,假如您有兩個組件,MyHello 1.0.0.0 版與 MyHello 2.0.0.0 版,如果尚未提供任何版本資訊,則會使用 2.0 版組件來啟動已知物件。建置用戶端時,不管參考的版本為何,都會採用這個版本,這點請您特別注意。

您可以設定服務來使用特定的組件版本。例如,下列組態檔顯示如何指定版本。請注意,如果組件位於全域組件快取中,您必須指定所有型別資訊,包括文化資訊與公開金鑰等資訊。下列組態範例將省略強式名稱資訊以專注在版本設定上。

<configuration>
<system.runtime.remoting>
   <application name="RemotingHello">
      <lifetime 
         leaseTime="20ms" 
         sponsorshipTimeOut="20ms"
         renewOnCallTime="20ms" 
      />
      <service>
         <wellknown 
            mode="SingleCall" 
            type="Hello.HelloService,MyHello,Version=1.0.0.0,<strong name omitted>"
            objectUri="HelloService.soap" 
         />
         <activated 
            type="Hello.AddService, MyHello"
         />
      </service>
      <channels>
         <channel 
            port="8000"
            ref="tcp"
         >
         </channel>
      </channels>
   </application>
</system.runtime.remoting>
</configuration>

此檔案會指定應該使用 1.0.0.0 版的 MyHello 組件來為所屬用戶端建立物件。一旦在端點上針對相同物件指定了一個以上的版本,則在啟動物件時會使用最後指定的版本。在相同物件的不同版本之間,任何重大變更都會對用戶端有非常嚴重的影響,這點請您務必記得。如果在版本之間加入或修改方法參數,則編譯為 1.0 版的用戶端會在使用 2.0 版時擲回例外狀況。因此,當版本之間發生任何重要的變更時,建議您在不同的端點上裝載物件的新版本。

用戶端啟動物件

當用戶端啟動了用戶端啟動 (亦即,<activated>) 物件時,會將網路呼叫傳遞給啟動了要求物件的伺服器,並將該物件的物件參考傳回用戶端。由於用戶端會引導物件啟動,因此同時會選擇要啟動的物件版本。例如,如果用戶端使用 1.0 版的物件來建置,則會在伺服器上啟動版本 1.0 的 HelloService;如果用戶端使用 2.0 版的物件來建置,則會在伺服器上啟動 2.0 版的 HelloService

在設定服務時,您無法針對用戶端啟動型別指定其版本號碼,這點請您特別注意。同時,針對伺服器啟動型別所提供的任何版本設定資訊對於用戶端啟動物件不會有任何影響,就算兩種型別同時位於相同組件亦然。

例如,用戶端啟動型別與伺服器啟動型別都位於相同的組件中,而您想要使用 1.0 版來建置 client1,並使用 2.0 版來建置 client2。如果伺服器啟動物件上未指定任何版本資訊,則 client1 會收到 2.0 版的伺服器啟動物件以及 1.0 版的用戶端啟動物件。Client2 會同時收到屬於已知與啟動型別的 2.0 版物件。

如果您設定服務來使用已知物件的 1.0 版組件,則兩個用戶端都會收到 1.0 版的已知物件;client1 會收到 1.0 版的啟動型別,而 client2 則是收到 2.0 版的啟動型別。

您無法設定用戶端的啟動版本;用戶端會一直使用之前用來建置的版本。

物件參考

適用於伺服器啟動與用戶端啟動型別的相同規則,同樣適用於物件參考。例如,當用戶端啟動型別的 Proxy 被當成參數從某個用戶端傳遞至另一個用戶端,或從用戶端傳遞至伺服器時,就會將內嵌在物件參考中的版本資訊一併傳遞過去。當接收者嘗試呼叫物件參考所產生的 Proxy 上的方法時,內嵌在物件參考中的版本優先順序會高於建置用戶端時所使用的版本。如果是伺服器啟動物件,則伺服器會指定所使用的版本,而將物件參考當成參數收下的所有用戶端會與設定服務時所指定的版本進行通訊。如果找不到任何版本設定,則會在伺服器上啟動最新的版本。

以傳值方式封送處理的物件

當以傳值方式封送處理 (MBV) 的物件在應用程式定義域之間互相傳遞時,所使用的格式器將決定要加入的版本資訊。BinaryFormatter 物件一律會加入版本資訊,而 SoapFormatter 物件則會忽略版本資訊。這個選項可同時針對兩個格式子加以啟用或停用。例如,如果將下列命令列加入組態檔中,則 SoapFormatter 會在序列化物件時加入版本設定資訊。

<formatter ref="soap" includeVersions="true" />

另請參閱

概念

遠端應用程式的組態
用戶端啟動過程
伺服器啟動過程

其他資源

.NET Framework 遠端處理概觀