2013-03-21 71 views
26

我在項目中使用Microsoft.Bcl.Asyncpackage,並且此項目是由不使用異步功能的另一個項目引用的。如何使用Microsoft.Bcl.Async權限?

主要參考「XYZ.dll」無法得到解決,因爲它的框架的間接依賴性:

現在,當我編譯溶液(或僅第二個項目),我得到這個錯誤警告程序集「System.Runtime,Version = 1.5.11.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a」,這在當前目標框架中無法解決。 」 .NETFramework,版本= V4.0" 。要解決此問題,請刪除引用「XYZ.dll」或將應用程序重定向到包含「System.Runtime,版本= 1.5.11.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a」的框架版本。

我在兩個項目中使用的app.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:bcl="urn:schemas-microsoft-com:bcl"> 
     <dependentAssembly bcl:name="System.Runtime"> 
     <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.5.16.0" newVersion="2.5.16.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.5.16.0" newVersion="2.5.16.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

我做錯了嗎?

我不想引用異步包dll。

我不能使用.Net 4.5目標。必須.NET 4

目標框架的所有項目:.NET Framework 4的

+0

什麼是兩個項目的目標框架? – 2013-03-21 16:00:16

+0

@ToniPetrina所有項目的目標框架是「.NET Framework 4」 – punker76 2013-03-21 16:01:40

+0

奇怪,我在引用使用該包的程序集時沒有問題。您是否將Microsoft.Bcl.Async添加到兩個項目中? – 2013-03-21 16:07:35

回答

23

摘要

有一對夫婦workaroun的您可以使用DS:

  1. Microsoft.Bcl.Async包安裝到引用項目。

  2. 安裝Microsoft.Bcl.Build包到引用項目。這包含實際的修補程序,並且完全是構建時間依賴性。當你這樣做時,你必須在項目的App.Config中有合適的綁定重定向(比如你上面列出的) - 不管它是一個類庫,web項目還是一個可執行文件。

  3. 如果您不想依賴於任何包,請獲取Microsoft.Bcl.targets文件(與Microsoft.Bcl.Build一起安裝)中的PropertyGroup元素的內容,並將其插入到引用的底部項目在最後一個導入元素之後。

注:而且,任何選項,你選擇上面,當你發貨,負責就Microsoft.Bcl.Async的依賴(如用舊Microsoft.CompilerServices.AsyncTargetingPack)圖書館,你必須把那些二進制文件(System.Runtime,System.Threading.Tasks,Microsoft.Threading.Tasks。*)與使用您的庫的應用程序/包。

說來話長

正如彼得指出,這是僅出現Microsoft.Bcl.Async而不是Microsoft.CompilerServices.AsyncTargetingPack,由於他們的設計方式的已知問題。

Microsoft.Bcl.Async的設計的一部分是通過一個新的.NET 4.5程序集(System.Runtime,System.Threading.Tasks)向後移植(通過NuGet包),以便它們可以在4.0上運行。 MSBuild不喜歡這樣,它會導致它相信引用庫已經從一個更新的框架版本獲得了對程序集的依賴。 Microsoft.Bcl.Build包中的解決方法修復了此問題。

+0

thx爲您的答覆,我會檢查第二個和第三個解決方法明天(德國時間)... – punker76 2013-03-21 22:14:59

+1

第三個選項的作品,thx! – punker76 2013-03-22 08:57:57

+0

什麼是「合適的綁定重定向」? – 2013-07-17 15:17:34

3

使用Async Targeting Pack for Visual Studio 11代替。

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

如果你喜歡使用Microsoft.Bcl.Async搶鮮,你必須將它添加到所有項目。 Bcl.Async的下一個版本應該改進了消息傳遞以更好地詳細說明這一點。

如果您使用的是VS 2010,我唯一知道的就是AsyncCTP;所以,它沒有必要使用Microsoft.Bcl.Async在2010年VS

更新:

WRT到Microsoft.Bcl.Async:各地MSB發出警告(「解決不了.. 「.indirect dependency ...」已知並正在解決。在將來的某些更新中(對於MSBuild和Microsoft.Bcl.Async),這將會被修復,並且您將不會在的兩個項目中包含Microsoft.Bcl.Async。

+0

「此包需要Visual Studio 11,並且不適用於Visual Studio 2010」不幸的是,我在2010年,但OP聽起來好像是在2012年。 – 2013-03-21 16:45:23

+0

是的,針對Visual Studio 11的異步定位包「適用於Visual Studio 11 「又名Visual Studio 2012. – 2013-03-21 17:09:39

+0

根據從Microsoft收到的信息添加了一些更新。 – 2013-03-21 17:58:39