天天看點

引用dll 編譯成功,運作報錯

 

TypeLoadException編譯成功,運作時報錯

表現:

  代碼編譯成功,運作時報錯。

  原因:

  由于代碼在編譯過程中的順序問題,頂層引用的dll,在編譯過程中覆寫了底層的使用的同名dll,導緻了雖然底層編譯時,其引用的dll是存在的,是以編譯不會報錯,但是在在編譯頂層代碼時,在bin目錄中,其引用的dll覆寫了底層編譯時添加的同名dll,這就出現了雖然編譯過程中并沒有報錯,可是運作時會出現TypeLoadException (類型加載異常),因為相應的dll已經被偷偷換掉了。

  備注:

  這個事情發生的原因是因為其他組引用Other.dll錯誤導緻的,之前A目錄和B目錄中的Temp.dll中的内容是一樣,Other.dll引用的是A.Temp.dll,但是後來B.Temp.dll中有更新,但是A.Temp.dll沒有更新,而我們底層引用的是B.Temp.dll,表現層引用的是Other.dll,就導緻了代碼編譯成功,運作時報錯,排錯排了好久。

舉例:一個解決方案有多個項目 ,項目A 引用other.dll 版本2.5.6 ,項目B 引用other.dll 版本2.4.1

項目A引用了項目B,編譯成功,但這時運作報錯,頂層A會報找不到某方法或引用other.dll 版本2.5.6找不到之類的錯誤,

解決方法:

這時需要項目A引用other.dll 版本降到2.4.1,或者B 引用other.dll 版本升到2.5.6,其實就是保持引用版本一緻

注意:若按上述方法解決後 運作還報錯,可能出現項目C引用項目A ,  而項目C的app.config的other.dll版本号與項目A不一緻,修改為與項目A相同版本号

<dependentAssembly>

        <assemblyIdentity name="other" publicKeyToken="0df73ec7942b34e1" culture="neutral" />

        <bindingRedirect oldVersion="0.0.0.0-2.4.1.0" newVersion="2.4.1.0" />

  </dependentAssembly>