天天看點

Sqlite 混合模式程式集是針對“v2.0.50727”版的運作時生成的,在沒有配置其他資訊的情況下,無法在 4.0 運作時中加載該...

開發環境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)

今天在做Sqlite資料庫測試,一運作程式在一處方法調用時報出了一個異常

混合模式程式集是針對“v2.0.50727”版的運作時生成的,在沒有配置其他資訊的情況下,無法在 4.0 運作時中加載該程式集

其調用的方法是從sqlite資料庫中擷取原來已經使用過的資料庫連接配接,當時也沒注意,就是準備設斷點然後單步調試,結果竟然是斷點無法進入方法體内,後來仔細看了一下方法體的時候發現了一個問題,就是現有的System.Data.Sqlite這個資料通路provider是針對.NET2.0環境開發(最新的版本是1.0.66.0,2010年4月18日釋出的),而目前官方也沒有給出最新的.NET4的資料通路支援。

既然出現這個問題,那肯定是上GOOGLE搜尋解決方案,畢竟微軟不可能因為更新到了.NET4.0的程式無法通路.NET2.0的程式集吧。後來在著名的stackoverflow.com上果然找到了解決方案,就是在app.config中添加一個配置節:startup

​​<​​​​startup​​ ​​useLegacyV2RuntimeActivationPolicy​​​​​=​​​​​"true"​​​​​>​​
​​<​​​​supportedRuntime​​​ ​​version​​​​=​​​​"v4.0"​​​​/>​​
​​</​​​​startup​​​​>​​      

這段配置節的意思是(參考自MSDN,具體位址:​​http://msdn.microsoft.com/zh-cn/library/bbx34a2h.aspx​​):

啟用 .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運作時來運作程式。