2016-06-18 23 views
19

Tôi muốn:Làm cách nào để tạo một thư viện lớp .NET Core và tham khảo nó từ dự án .NET 4.6?

  • Tạo thư viện lớp xác định một số giao diện và lớp trợ giúp chung đơn giản. Nó sẽ dựa vào các bộ sưu tập chung và IQueryable<T> nhưng không phụ thuộc bên thứ ba (tốt, JetBrains.Annotations).
  • Có thể tham khảo thư viện lớp đó từ mọi nơi (cụ thể là UWP, net46 và ASP.Net Core RC2)
  • Lý tưởng nhất, sử dụng hệ thống project.json trong suốt, mặc dù tôi sẵn sàng hy sinh nếu cần.
  • Xuất bản thư viện thành một thức ăn NuGet và từ đó sử dụng nó trong các ứng dụng khác

Khi tạo dự án thư viện lớp học của tôi trong Visual Studio 2015,2, tôi thấy Class Library (.NET Core) mẫu, trong đó nêu

Mẫu dự án để tạo thư viện lớp dưới dạng gói NuGet có thể nhắm mục tiêu bất kỳ nền tảng nào

Mọi nền tảng! Brilliant ... Nhưng tôi không thể làm cho nó hoạt động được. Sau rất nhiều không quan trọng, tôi hiện đang có sau đây project.json (tôi đã có thể hoàn toàn bị phá vỡ nó bằng bây giờ):

{ 
"title": "My Really Useful Class Library", 
"copyright": "Copyright © 2015-16 Tigra Astronomy, all rights reserved", 
"description": "Really neat stuff", 
"language": "en-GB", 
"version": "1.0.0-*", 
"dependencies": { 
    "JetBrains.Annotations": "10.1.4", 
    }, 
"frameworks": { 
    "netstandard1.5": { 
     "imports": "dnxcore50", 
     "dependencies": { 
      "NETStandard.Library": "1.5.0-rc2-24027", 
      "System.Linq.Expressions": "4.0.11-rc2-24027" 
      } 
     } 
    "net46": { 
     "frameworkAssemblies": { 
      "System.Collections": "4.0.*" 
      }, 
     "dependencies": {} 
     } 
    }, 
    "buildOptions": { 
     "xmlDoc": true 
     } 
} 

Điều tiếp theo tôi làm là tạo ra dự án .NET Framework 4.6 của tôi trong cùng một giải pháp, và cố gắng tham khảo thư viện lớp. Nó cho phép tôi thêm tham chiếu nhưng tôi nhận được lỗi xây dựng, biểu tượng chưa được giải quyết, R # không hài lòng, v.v.

Tôi đoán tôi không làm đúng (không có gì ngạc nhiên khi tôi đang dò dẫm trong tối).

Tôi đã đọc một số tài liệu về TFM, khung công tác và thư viện nhưng không có tài liệu nào thực sự có ý nghĩa nhiều.

Tôi thực sự cần gì để đưa vào thư viện lớp học của mình project.json, để tôi có thể tham khảo nó từ ứng dụng .net framework 4.6 của tôi, cũng như từ ứng dụng UWP và ASP.NET Core RC2? Đây có thực sự là cách tiếp cận đúng hay tôi đã bắt đầu trên chân sai?

+0

Vui lòng giải thích cho tôi vì chưa chọn câu trả lời 'chính xác'. Tôi vẫn đang làm việc thông qua một số kịch bản đã nâng cấp lên bản phát hành RTM mới nhất và công cụ xem trước mới nhất. –

+1

Đảm bảo kiểm tra phần tử ' StingyJack

Trả lời

3

Mẫu dự án mới/.xproj hoạt động hơi khác một chút. Các thư viện lớp (và các mẫu ứng dụng) mới tạo ra các gói nuget, chứ không phải các assembly đồng bộ.

Trong gói gói đó tất cả các mục tiêu được đóng gói trong đó. Điều đó đang được nói, bạn thêm dự án mới cùng một cách khi bạn thêm bất kỳ gói nuget khác: Bạn đặt nuget vào một nguồn cấp dữ liệu nuget, tham khảo này trong Visual Studio và sau đó lấy nó từ đó.

Nếu bạn không có máy chủ nuget đang chạy (gói Visual Studio Team Services + gói NuGet, myget, tự lưu trữ), bạn cũng có thể đặt các gói vào thư mục (cục bộ hoặc mạng) và thêm thư mục này dưới dạng nguồn nuget.

Nếu đó là "quá" nhiều công việc, bạn cũng có thể tạo hai dự án vào một thư mục: A * .csproj và * .xproj. * .csproj nhắm vào .NET 4.6 Framework và * .xproj vẫn như bạn đã chỉ ra ở trên và có nhiều mục tiêu. Với thiết lập này, bạn thường có thể tham khảo dự án theo cách bạn đã sử dụng trước đó (nếu chúng nằm trong cùng một giải pháp), bằng cách thêm một tham chiếu.

+3

Các mẫu mới không tạo gói nuget theo mặc định. Đây là một phần của DNX/RC1 nhưng các mẫu dự án RC2 không tự động thực hiện điều này trong VS. Bạn sẽ phải chạy gói 'dotnet' để tạo các gói. –

35

Hiện tại, có hai cách tạo dự án C#: xprojcsproj. Giả sử chúng tôi đang sử dụng project.json cho cả hai, vẫn hoạt động khác nhau đối với các loại dự án - cho xproj, project.json chứa mọi thứ cần thiết để xây dựng dự án; cho csproj, nó chỉ chứa phụ thuộc vào nuget.

Điều đó nói rằng, một số loại dự án, như UWP, không thể được xây dựng với xproj do cần một đường ống xây dựng phức tạp hơn so với những gì xproj/project.json hỗ trợ. (BTW, đây là một lý do chính để chuyển về msbuild.)

Ngoài ra còn có hai cách tạo thư viện lớp chuẩn .NET: bạn có thể sử dụng xproj với project.json, như bạn đã làm, hoặc bạn có thể tạo dự án "Thư viện lớp học di động" thường xuyên csproj. Với VS 2015 Update 3 RC, bạn có thể thay đổi PCL để nhắm mục tiêu phiên bản .NET Standard (netstandard1.x thay vì cấu hình PCL, 259, v.v.).

Nếu bạn sử dụng thư viện lớp học csproj để nhắm mục tiêu netstandard1.x, mọi thứ sẽ chỉ hoạt động cho bạn khi thêm tham chiếu dự án. Lưu ý rằng UWP hiện hỗ trợ tối đa netstandard1.4 dựa trên platform map. Thách thức là nếu bạn muốn sử dụng dự án xproj/project.json. Một lý do chính để sử dụng xproj hôm nay là cho phép biên dịch chéo giữa nhiều khung mục tiêu. Tức là, tạo ra nhiều hơn một đầu ra từ dự án của bạn. Điều đó khác với việc tạo ra một đầu ra đơn lẻ có thể được tham chiếu từ bất kỳ dự án tương thích nào. Cả hai đều có sử dụng của họ, nó phụ thuộc vào nhu cầu của bạn.

Nếu bạn quyết định tạo một thư viện lớp xproj, bạn có thể sử dụng cách này để tham khảo dự án UWP hoặc bất kỳ loại dự án tương thích nào khác nếu hộp thoại "Thêm tham chiếu" không hoạt động 't như csproj ->xproj bị hỏng khá nhiều). Thay vì sử dụng hộp thoại, sửa UWP bạn csproj để trỏ đến đầu ra của xproj như thế này:

<Reference Include="System.Reactive.Interfaces"> 
    <HintPath>..\System.Reactive.Interfaces\bin\$(Configuration)\netstandard1.0\System.Reactive.Interfaces.dll</HintPath> 
</Reference> 

Đoạn trên được lấy từ Rx.NET UWP Test Runner here

Nếu bạn làm điều này , bạn cũng sẽ cần phải thêm phụ thuộc xây dựng từ dự án UWP của bạn vào xproj của bạn vì MSBuild/Visual Studio sẽ không biết về nó và xây dựng mọi thứ theo thứ tự sai. Để thực hiện điều này, nhấn chuột phải vào dự án UWP của bạn trong Solution Explorer, sau đó chọn "Build Dependencies -> Dependencies Project". Trong hộp thoại đó, hãy chọn hộp cho xproj của bạn để đảm bảo rằng VS/MSbuild biết cách xây dựng cái đầu tiên đó.

Bạn có thể xem giải pháp Rx.NET đầy đủ ở đây, bao gồm tài liệu tham khảo xproj->xproj và tài liệu tham khảo UWP ->xproj tôi đã đề cập ở trên.

+0

Cảm ơn Oren, điều đó bắt đầu có ý nghĩa bây giờ. Tôi cũng có thể bắt đầu hiểu tại sao MS lại nói "chờ công cụ mới". Có lẽ tôi nên thử VS2015.3 RC ...Tôi có thể muốn thư viện của tôi để cuối cùng làm việc trên các mục tiêu dựa trên UWP/ARM theo IoT Core, do đó tôi muốn sử dụng một xproj. –

+2

Nếu mục tiêu của bạn là tương thích với UWP và ASPNet Core 1.0 và bạn chỉ muốn một đầu ra duy nhất, cách tiếp cận dễ nhất có thể là 'csproj' nhắm mục tiêu' netstandard1.4'. Bạn không cần một 'xproj' cho các tham chiếu đó và dự án đến dự án dễ dàng hơn theo cách đó. –

+0

Ồ, thực tế tôi có thể thấy liên kết đó trong Bản cập nhật 2015 2015 ... Giá trị RC 2015.3 có được cài đặt ở giai đoạn này không? Vì nó là một RC nó nên được khá ổn định ... –

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