本文內容:
1.問題引出
2.問題解決
3.原因分析
最近部門的開發環境都更新到了WIN7+.NET framework4+VS2010上,在體驗新技術和新環境帶給我們提高效率的方式方法的同時也帶來了一些兼容性的問題;這幾天項目閑暇時在研究SQLite,在做實驗的時候碰到個問題,代碼編譯通過執行時反復異常中斷,查到后面原來是SQLite.dll是在framework2.0環境下編譯的而現在的運行環境是framework4.0,所以就出現了運行異常,如圖:

由于以后的開發過程中,可能會引用一些第三方的組件,有可能是老的framework版本下編譯的,同樣會出現此類的問題,所以在本文中提供一個解決辦法和說明造成此問題的原因。
查閱了相關資料,stackoverflow.com上建議在config文件中增加配置:
復制代碼 代碼如下:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
但是使用此方法編譯后問題仍然沒有解決,但是問題可以明確鎖定為.net runtime環境的問題了。
復制代碼 代碼如下:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
<requiredRuntime version="v4.0.30319" />
</startup>
再次查閱CLR Runtime版本的相關資料,引用以下CLR運行規則和各版本間關系匯總表格,如下:
規則:
1. CLR4.0及以上版本編譯的應用程序總是運行在應用程序所被編譯的CLR版本上;
2. CLR4.0以下版本編譯的應用程序優先運行在被編譯的CLR版本上,如果此版本不存在,則運行最新的小于CLR4.0的版本;
匯總如下:
EXE被編譯的CLR版本號
機器上安裝有CLR 1.1?
機器上安裝有CLR 2.0?
機器上安裝有CLR 4.0?
結果
1.1
是
無所謂
無所謂
加載CLR 1.1
2.0
無所謂
是
無所謂
加載CLR 2.0
1.1
否
是
無所謂
加載CLR 2.0
1.1
否
否
是
失敗
2.0
無所謂
否
是
失敗
至此我們就能很清楚的搞清各個CLR版本之間的聯系了。
總結:微軟每次版本升級都會造成一些新的問題的出現,早年從CLRv1.0到CLRv2.0曾經也造成很多的困惑,可能也是由于過大的組織造成不能面面俱到吧,希望在今后的版本升級中能真正做到無縫的版本聯接。
新聞熱點
疑難解答
圖片精選