混合模式程式集是針對“v2.0.50727”版的執行時生成的,在沒有配置其他資訊的情況下,無法在 4.0 執行時中載入該程式集。
今天在把以前寫的程式碼生成工具從原來的.NET3.5升級到.NET4.0,同時準備進一步完善,將程式集都更新後,一執行程式在一處方法呼叫時報出了一個異常:
混合模式程式集是針對“v2.0.50727”版的執行時生成的,在沒有配置其他資訊的情況下,無法在 4.0 執行時中載入該程式集
其呼叫的方法是從sqlite資料庫中獲取原來已經使用過的資料庫連線,當時也沒注意,就是準備設斷點然後單步除錯,結果竟然是斷點無法進入方法體內,後來仔細看了一下方法體的時候發現了一個問題,就是現有的System.Data.Sqlite這個資料訪問provider是針對.NET2.0環境開發(最新的版本是1.0.66.0,2010年4月18日釋出的)
既然出現這個問題,那肯定是上GOOGLE搜尋解決方案,畢竟微軟不可能因為升級到了.NET4.0的程式無法訪問.NET2.0的程式集吧。後來在著名的stackoverflow.com上果然找到了解決方案,就是在app.config中新增一個配置節:startup
<?xml version="1.0"?><configuration><startup useLegacyV2RuntimeActivationPolicy="true"><supportedRuntime version="v4.0" sku= ".NETFramework,Version=v4.0"/><supportedRuntime version="v2.0.50727"/></startup></configuration>
啟用 .NET Framework 2.0 版 執行時啟用策略,這是通過使用最新支援的執行時載入所有程式集。
注意:由於config配置檔案的特性,如果在config配置檔案中存在configSections節點,則必須將configSections放在一個,否則會引發異常:配置系統未能初始化
在原來.NET2.0,.NET3.5的時候,由於程式執行環境本質還是.NET2.0,而到了.NET4.0由於整個程式集的版本更新,以前使用.NET2.0所編寫的程式集與.NET4.0的程式集繼續擰互操作的時候就會出現上面所說的相容性問題。
通過MSDN,我們可以知道,startup配置節中的useLegacyV2RuntimeActivationPolicy屬性是在.NET4.0中新增的,預設是false,表示:
使用預設的 .NET Framework 4 啟用策略,該啟用策略將載入 .NET Framework 4 通過使用公共語言執行時 (CLR) 版本 4 所建立的程式集,以及 CLR 早期版本通過使用受支援的低於版本 4 的最高 CLR 版本所建立的程式集。
現在如果當程式在.NET4.0環境下要使用.NET2.0及.NET3.5的程式時就必須將useLegacyV2RuntimeActivationPolicy設定為true,同時還要注意,需要在startup配置節的位元組中新增supportedRuntime配置節,並指定為“v4.0”,表示使用.NET4.0執行時來執行程式。
有關更多startup及其子級可以檢視MSDN: