2017-03-08 14 views
17

我在VS 2015和F#4.0(4.4.0.0)中進行了相當長時間的開發。使用VS 2017時無法解析對程序集的依賴關係FSharp.Core 4.4.1.0

隨着VS 2017的發佈,我想在最新的VS開發工作中打開解決方案,但仍然保留VS 2015,F#4.0,.NET 4.5.2的項目。構建服務器也必須使用VS 2015一段時間。

據我記得,這種情況在早期的VS版本升級中沒有問題,但是當時我不認爲我使用了F#。

我打開解決方案並嘗試編譯。我在C#應用程序項目中遇到此錯誤。 (還有其他C#應用程序,並且至少有一個引用F#庫)。

未知的生成錯誤,'無法解析依賴程序集'FSharp.Core,Version = 4.4.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a '因爲它沒有被預加載。在使用ReflectionOnly API時,必須通過ReflectionOnlyAssemblyResolve事件按需預加載或加載相關程序集。

解決方案中的所有F#項目都是4.0(4.4.0.0)。我再次檢查。

這是怎麼發生的?

回答

16

我搜索了「4.4.1.0」,並發現C#項目的「obj」文件夾有一個與app.config不同的.exe.config文件。它有這個額外的信息不在項目的app.config中。

<runtime> 
... 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.1.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 

爲什麼這會自動附加,爲什麼只在這個特定的C#項目中?

我試圖將該部分複製到項目的app.config,並在兩個地方將其更改爲4.4.0.0,但這並不奏效。也嘗試使用「4.4.1.0」作爲舊版本的上限,並且具有「4.4.0.0」作爲新版本,但仍然沒有工作。相同的編譯錯誤。

然後我刪除了該部分,並在C#項目中引用了FSharp.Core 4.4.0.0。這終於擺脫了編譯錯誤。

我運行程序。它與這個例外墜毀。

未處理的異常:無法加載文件或程序集「FSharp.Core,Version = 4.4.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a」或其某個依賴項。定位的程序集清單定義與程序集引用不匹配。 (來自HRESULT的例外:0x80131040)

我重新插入了重定向部分,現在程序運行正常。

只是總結一下,我加入到FSharp.Core 4.0參考,並重定向看起來像這樣

<bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.0.0" /> 

有了這些改進,解決方案仍然工作在2015年VS

+0

上述問題發生在使用F#庫的C#程序中。今天,我在VS 2017中遇到了一個使用F#4.0.0.0的F#程序的類似問題。沒有編譯錯誤,只有上面的運行時錯誤。正如我在這裏解釋的那樣,我使用bindingRedirect解決了這個問題。我不明白爲什麼這隻發生在我的一些程序中。 –

+1

似乎我在調試過程中無法檢查表達式。添加手錶顯示錯誤:錯誤CS1705:具有標識'x'的程序集'x'使用'FSharp.Core,版本= 4.4.1.0,文化=中立,PublicKeyToken = b03f5f7f11d50a3a',其版本高於引用程序集'FSharp'。 Core'與身份'FSharp.Core,Version = 4.4.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a' – Nuzzolilo

+0

太棒了!這對我來說就像一個魅力。謝謝! –

-2
也有望

檢查消息中程序集的程序集引用。對於我來說,我有一個參考組件X的參考Y.因爲Y不見了,我得到了這個錯誤。通過引用Y,錯誤爲我解決了。