2016-11-20 16 views
8

Tôi đang tạo thư viện có thể tái sử dụng nhắm vào một số nền tảng (.NET 4.0, .NET 4.5, .NETStandard 1.0 và .NETStandard 1.3). Phiên bản .NET 4.5 của dự án này chứa một số tính năng không có sẵn trong phiên bản .NET 4.0.Cách để cho Visual Studio 2015 xproject (project.json) tham khảo khung cao nhất của một dự án phụ thuộc

Dự án thử nghiệm đơn vị tham khảo dự án thư viện này có một nền tảng đích duy nhất, cụ thể là NET 4.5.1. Dự án thử nghiệm này rõ ràng chứa một số mã kiểm tra các tính năng .NET 4.5 cụ thể của thư viện lõi.

Thật không may, dự án thử nghiệm không biên dịch, vì Visual Studio dường như tham chiếu phiên bản .NETStandard 1.0, rõ ràng là không chứa tính năng này.

Để chứng minh vấn đề của tôi, tôi giảm này với hai dự án sau:

Lõi thư viện:

{ 
    "version": "1.0.0-*", 

    "frameworks": { 
    "netstandard1.0": { 
     "dependencies": { 
     "NETStandard.Library": "1.6.0" 
     } 
    }, 
    "net40": {}, 
    "net45": {} 
    } 
} 

Mã file:

namespace CoreLibrary 
{ 
#if NETSTANDARD1_0 
    public class ClassNetStandard { } 
#endif 

#if NET40 
    public class ClassNet40 { } 
#endif 

#if NET45 
    public class ClassNet45 { } 
#endif 
} 

Kiểm tra thư viện:

{ 
    "version": "1.0.0-*", 

    "dependencies": { 
    "CoreLibrary": { "target": "project" } 
    }, 
    "frameworks": { 
    "net451": {} 
    } 
} 

Code:

// This compiles 
new CoreLibrary.ClassNetStandard(); 

// This doesn't. 
// error: Type or namespace 'ClassNet40' does not exist in namespace 'CoreLibrary' 
new CoreLibrary.ClassNet40(); 
// error: Type or namespace 'ClassNet45' does not exist in namespace 'CoreLibrary' 
new CoreLibrary.ClassNet45(); 

Những gì tôi nên thay đổi để cho phép dự án thử nghiệm đơn vị của tôi để biên dịch và kiểm tra NET 4.5 tính năng cụ thể?

+1

Trong trường hợp của tôi (với hai dự án chính xác bạn đã cung cấp), Thư viện kiểm tra thực sự biên dịch với "CoreLibrary.ClassNet45() mới"; và _not_ biên dịch với "new CoreLibrary.ClassNetStandard();". Vì vậy, như bạn mong đợi. Bạn chắc chắn nó thực sự không hoạt động với ClassNet45 trong trường hợp của bạn? Bởi vì nó có thể cho thấy có lỗi trong cửa sổ "lỗi" trong Visual Studio, nhưng vẫn thực sự biên dịch thành công. – Evk

+0

@Evk: Bạn nói đúng. Mặc dù cả IDE và Danh sách Lỗi đều hiển thị lỗi, assembly không được biên dịch vào thư mục bin \ Debug \ net451. Sau khi kiểm tra hội đồng này với Resharper, nó hoạt động. Kết luận: Visual Studio Tooling hút. – Steven

+0

Hãy thử cài đặt phiên bản mới nhất của các công cụ .NET Core cho VS 2015 tại đây: https://www.microsoft.com/net/core#windowsvs2015. Điều này thực sự giải quyết điều này cho tôi (không có lỗi giả nào nữa). – Evk

Trả lời

1

Dường như có lỗi trong công cụ Visual Studio cho .NET Core. Khi bạn tham chiếu dự án đa khung công tác khác - Visual Studio chỉ lấy khung công tác được liệt kê đầu tiên từ danh sách (trong trường hợp của bạn - "netstandard1.0") và xử lý dự án được tham chiếu đó là nhắm mục tiêu duy nhất cho khung này. Tuy nhiên, trình biên dịch xử lý chính xác, và trong khi nó dường như dự án xây dựng chính xác - trong thực tế nó không. Mặt khác, khi bạn sử dụng định nghĩa ClassNet45 - nó có vẻ là rằng nó không biên dịch (Visual Studio hiển thị lỗi) - nó thực sự biên dịch thành công.

Dường như các công cụ Visual Studio cho .NET Core chưa được đánh bóng đủ, nhưng có thể lỗi này sẽ được giải quyết trong một tương lai gần.

+0

Nếu đó là lỗi, bạn có thể liên kết đến vấn đề thực tế trên Github không? Bạn nói đó là một lỗi, nhưng không có một số loại bằng chứng, nó chỉ là một giả định. Làm cách nào bạn xác minh rằng đây là lỗi? –

+0

@GeorgeStocker Vâng đó là giả định, và tôi nghĩ rằng tôi chỉ ra rằng ("Có _seems be_ một lỗi"). Mặc dù nó khá rõ ràng rằng hành vi là sai - dự án biên dịch thành công trong khi Visual Studio chỉ ra có lỗi trong đó và như vậy nó không nên biên dịch. Bạn không chắc chắn loại xác minh mạnh mẽ hơn mà bạn muốn. – Evk

+0

@GeorgeStocker Đối với vấn đề thực tế, có 403 vấn đề mở trên github cho các công cụ cốt lõi asp.net cho Visual Studio và nó không phải là rất dễ dàng để tìm ra nếu nó đã được báo cáo hay không. Nhưng đây là vấn đề _similar_: https://github.com/aspnet/Tooling/issues/849. – Evk

Các vấn đề liên quan