2013-03-21 19 views
26

Tôi sử dụng Microsoft.Bcl.Asyncpackage trong một dự án và dự án này được tham chiếu bởi một dự án khác không sử dụng các tính năng không đồng bộ.Cách sử dụng Microsoft.Bcl.Async phải không?

Bây giờ tôi nhận được cảnh báo lỗi này khi tôi biên dịch các giải pháp (hoặc chỉ là dự án thứ hai):

Các tài liệu tham khảo chính "XYZ.dll" không thể được giải quyết bởi vì nó có một sự phụ thuộc gián tiếp vào khuôn khổ assembly "System.Runtime, Version = 1.5.11.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a" không thể được giải quyết trong khung được nhắm mục tiêu hiện tại. ".NETFramework, Version = v4.0". Để giải quyết vấn đề này, hãy loại bỏ tham chiếu "XYZ.dll" hoặc nhắm mục tiêu lại ứng dụng của bạn lên phiên bản khung có chứa "System.Runtime, Version = 1.5.11.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a".

tôi sử dụng trong cả hai dự án app.config này:

<?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> 

Những gì tôi đang làm sai?

Tôi không muốn tham chiếu dll gói async.

Tôi không thể sử dụng mục tiêu .Net 4.5. Nó phải được NET 4.

Target Framework cho tất cả các dự án: .NET Framework 4

+0

Khung mục tiêu cho một trong hai dự án là gì? –

+0

@ToniPetrina Khung mục tiêu cho tất cả các dự án là "Khuôn khổ .NET 4" – punker76

+0

Lạ, tôi không gặp vấn đề gì trong việc tham chiếu các assembly bằng gói đó. Bạn đã thêm Microsoft.Bcl.Async cho cả hai dự án? –

Trả lời

23

Tóm tắt:

có một vài workaroun ds sẵn cho bạn:

  1. Cài đặt Microsoft.Bcl.Async gói cho dự án tham khảo.

  2. Cài đặt gói Microsoft.Bcl.Build vào dự án tham chiếu. Điều này chứa bản sửa lỗi thực tế và chỉ phụ thuộc vào thời gian xây dựng. Khi bạn làm điều này, bạn phải có các chuyển hướng ràng buộc thích hợp trong App.Config của dự án (chẳng hạn như những gì bạn đã liệt kê ở trên) - bất kể đó là thư viện lớp, dự án web hay một tệp thực thi.

  3. Nếu bạn không muốn phụ thuộc vào bất kỳ gói nào, hãy lấy nội dung của phần tử PropertyGroup trong tệp Microsoft.Bcl.targets (được cài đặt với Microsoft.Bcl.Build) và chèn vào cuối phần tham chiếu dự án sau phần tử Nhập cuối cùng.

Lưu ý: Trong đó bao giờ tùy chọn mà bạn chọn ở trên, khi bạn gửi một thư viện mà phải mất một sự phụ thuộc vào Microsoft.Bcl.Async (như với Microsoft.CompilerServices.AsyncTargetingPack cũ), bạn phải vận chuyển những mã nhị phân (System.Runtime, System.Threading.Tasks, Microsoft.Threading.Tasks. *) Với ứng dụng/gói sử dụng thư viện của bạn.

dài câu chuyện:

Như Peter chỉ ra đây là một vấn đề được biết rằng chỉ xảy ra cho Microsoft.Bcl.Async và không Microsoft.CompilerServices.AsyncTargetingPack, do cách chúng được thiết kế.

Một phần thiết kế của Microsoft.Bcl.Async là để backport (thông qua gói NuGet) một số phiên bản .NET 4.5 mới (System.Runtime, System.Threading.Tasks) để chúng chạy trên 4.0. MSBuild không thích điều này, và nó làm cho nó tin rằng thư viện tham chiếu đã thực hiện một sự phụ thuộc vào một assembly từ một phiên bản framework mới hơn. Cách giải quyết trong Microsoft.Bcl.Build gói sửa lỗi này.

+0

thx cho trả lời của bạn, tôi sẽ kiểm tra workaround thứ hai và thứ ba vào ngày mai (thời gian tiếng Đức) ... – punker76

+1

công trình tùy chọn thứ ba, thx! – punker76

+0

"Chuyển hướng ràng buộc thích hợp" là gì? –

3

Sử dụng Async Targeting Pack for Visual Studio 11 để thay thế.

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

Nếu bạn thích sử dụng Microsoft.Bcl.Async phát hành trước, bạn sẽ phải thêm nó vào tất cả các dự án. Bản phát hành tiếp theo của Bcl.Async cần phải cải thiện tính năng nhắn tin để có thông tin chi tiết hơn.

Nếu bạn đang sử dụng VS 2010, điều duy nhất mà tôi biết là cung cấp cho bạn async/wait là AsyncCTP; như vậy, nó không có ý nghĩa để sử dụng Microsoft.Bcl.Async trong VS 2010.

update:

WRT để Microsoft.Bcl.Async: Vấn đề xung quanh MSB cảnh báo ("không thể được giải quyết .. Trong một số bản cập nhật trong tương lai (với MSBuild và Microsoft.Bcl.Async), điều này sẽ được sửa và bạn sẽ không phải bao gồm Microsoft.Bcl.Async trong cả hai dự án.

+0

"Gói này yêu cầu Visual Studio 11 và sẽ không hoạt động với Visual Studio 2010" Thật không may, tôi là vào năm 2010, nhưng OP âm thanh như thể là vào năm 2012. –

+0

Đúng, Gói nhắm mục tiêu Async cho Visual Studio 11 là "dành cho Visual Studio 11 "aka Visual Studio 2012. –

+0

Đã thêm một số cập nhật dựa trên thông tin nhận được từ Microsoft. –