Skip to content
February 24, 2011 / windperson

.Net程式執行時期載入不同版本的相同assembly的方法

在這裡以TeeChart.Net函式庫為例,舊的專案A原本用的是v2.0.2179.21175的TeeChart.dll,而另一專案B用的是比較新的v2.0.3309.32489。

  1. 首先,得在那兩個加不同版本assembly的Visual Studio專案裡,對於該assembly的reference設定『Copy Local』為False:
    image
    免得在編譯後的output會夾帶被參考的TeeChart.dll,造成兩個不同版本的相同Library在輸出目錄因編譯順序不同而互相被覆蓋的問題。而另外有個『Specify Version』的選項,可選True或False:
    image
    因為此設定僅供編譯時期VS參考用
  2. 在主程式,首先使用MSbuildNAnt寫build script,再不然就是手動copy,把那兩個版本的TeeChart.dll放在輸出主程式EXE的一個子目錄lib底下,最後輸出的結果會是:
    • 新版本路徑:”lib\TeeChart\latest\TeeChart.dll”
    • 舊版本路徑:”lib\TeeChart\v2.0.2179.21175\TeeChart.dll”
  3. 在主程式的App.config設定檔裡,增加<configuration>裡一個<runtime>的子節點,內容如下:
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="TeeChart"
                              publicKeyToken="9c8126276c77bdb7"
                              culture="neutral" />
            <codeBase version="2.0.3309.32489"
                      href="lib\TeeChart\latest\TeeChart.dll"/>
            <codeBase version="2.0.2179.21175"
                      href="lib\TeeChart\v2.0.2179.21175\TeeChart.dll"/>
          </dependentAssembly>
        </assemblyBinding>
    </runtime>
    

要注意的是,雖然在MSDN裡寫說有個<probing>可以設定程式執行時載入assembly的private path搜尋路徑,但CLR的Assembly Loader只會依據路徑載入第一個Partial Name名稱符合的assembly,即使只是版本號碼不符合,Assembly Loader也不會嘗試繼續找另一個assembly載入

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: