Làm thế nào để bạn chia sẻ mã giữa các dự án / giải pháp trong Visual Studio?


229

Tôi có hai giải pháp có một số mã chung, vì vậy tôi muốn trích xuất nó và chia sẻ nó giữa chúng. Hơn nữa, tôi muốn có thể phát hành thư viện đó một cách độc lập vì nó có thể hữu ích cho những người khác.

  • Cách tốt nhất để làm điều đó với Visual Studio 2008 là gì?
  • Là một dự án có mặt trong nhiều hơn một giải pháp?
  • Tôi có một giải pháp riêng cho đoạn mã riêng không?
  • Một giải pháp có thể phụ thuộc vào một giải pháp khác?

15
Đó là năm 2014. Nuget là câu trả lời.
Ravi

1
@Ravi Tôi muốn mô đun hóa Ứng dụng web Visual Studio được phát triển tại văn phòng của mình. Tuy nhiên, khi tôi cố gắng mô đun hóa Ứng dụng web Visual Studio thành các Ứng dụng web khác nhau, sự phụ thuộc vòng tròn giữa các thành phần xuất hiện là Wrong. Ví dụ: Tôi không thể mô đun hóa dự án POCO cho từng Ứng dụng web được lên kế hoạch vì có quá nhiều sự phụ thuộc. Có cách nào tôi có thể sử dụng Nuget để giúp Modularizing không?
CS Lewis

Câu trả lời:


70

Một dự án có thể được tham chiếu bởi nhiều giải pháp.

Đặt thư viện hoặc mã lõi của bạn vào một dự án, sau đó tham chiếu dự án đó trong cả hai giải pháp.


150
Được nhưng làm thế nào? Một số hướng dẫn?
cja

2
Câu trả lời (cũ) này không hoàn chỉnh do chính nó dẫn đến nhiều hội đồng: tuy nhiên, khi được kết hợp với ILMerge - đặc biệt là với tùy chọn nội địa hóa - nó trở thành một giải pháp rất mạnh mẽ.
dùng2246674

2
@ user2246674: tại sao nó không hoàn chỉnh vì có nhiều cụm? OP không nói gì về một hội đồng duy nhất.
John Saunders

1
@Jfly: Đổi tên những thứ không hiển thị công khai sẽ không ảnh hưởng đến mã bên ngoài. Đổi tên những điều mà đang hiển thị công khai chỉ nên được thực hiện nơi tất cả các dự án sử dụng mã thông thường, và mã chung thân, đang ở trong một giải pháp duy nhất. Bạn có thể tự tạo các giải pháp "chính" có chứa tất cả các dự án này và chỉ được sử dụng cho mục đích này.
John Saunders

1
Nó phụ thuộc vào những gì bạn có nghĩa là bởi một ví dụ khác. Bạn có thể làm tốt để bắt đầu một câu hỏi mới với một số chi tiết.
ilivewithian

248

Bạn có thể "liên kết" một tệp mã giữa hai dự án. Nhấp chuột phải vào dự án của bạn, chọn Add-> Existing item, và sau đó nhấp vào mũi tên xuống bên cạnh Addnút:

Ảnh chụp màn hình

Theo kinh nghiệm của tôi liên kết đơn giản hơn so với việc tạo một thư viện. Kết quả mã được liên kết trong một thực thi duy nhất với một phiên bản duy nhất.


9
Ngọt ngào - đó là câu trả lời tôi đang tìm kiếm. Tôi không muốn có một bộ sưu tập DLL. chúc mừng
CAD bloke

63
Tại sao bạn lại làm theo cách này? Đây là lý do tại sao chúng tôi có thư viện, đóng gói. Tôi thấy không có ý nghĩa kinh doanh, hoặc ý nghĩa logic về lý do tại sao bạn làm điều này.
Ryan Ternier

16
Hơn nữa, các liên kết của bạn có thể không được kiểm soát cùng một nguồn. Đây là đề nghị rất nguy hiểm.
Kugel

11
Có những tình huống mà giải pháp này hữu ích. Như một ví dụ tôi đang phát triển trong InfoPath 2007 khi việc triển khai một DLL riêng biệt vào SharePoint không đơn giản. Để chia sẻ chức năng chung giữa các biểu mẫu InfoPath, cách tiếp cận tệp lớp được liên kết là rất hữu ích. Nó được đặt một cấp trên các dự án biểu mẫu riêng lẻ và mọi thứ đều được kiểm soát nguồn ở cấp gốc.
Oliver Gray

6
Một ví dụ khác về tính hữu dụng nói rằng bạn đang phát triển hai ứng dụng cần liên lạc với nhau. Một là 64 bit và cái kia là 32, do đó bạn không nhất thiết muốn các dll riêng biệt được xây dựng từ cùng một mã để tham chiếu mẫu cho mỗi dự án. Bằng cách này, bạn có thể bắt chước chức năng c của việc sử dụng tệp .h.
dùng912447

33

File > Add > Existing Project...sẽ cho phép bạn thêm các dự án vào giải pháp hiện tại của bạn. Chỉ cần thêm điều này vì không có bài viết nào ở trên chỉ ra điều đó. Điều này cho phép bạn bao gồm cùng một dự án trong nhiều giải pháp.


1
Điều này không hoạt động; Mặt khác, nó không xây dựng cả hai dự án thành một tổ hợp.
Ian Boyd

24

Bạn có thể bao gồm một dự án trong nhiều hơn một giải pháp. Tôi không nghĩ rằng một dự án có một khái niệm về giải pháp mà nó là một phần của. Tuy nhiên, một cách khác là tạo ra giải pháp đầu tiên được xây dựng ở một nơi nổi tiếng và tham chiếu các nhị phân được biên dịch. Điều này có nhược điểm là bạn sẽ cần thực hiện một chút công việc nếu bạn muốn tham khảo các phiên bản khác nhau dựa trên việc bạn đang xây dựng cấu hình phát hành hay gỡ lỗi.

Tôi không tin rằng bạn có thể thực hiện một giải pháp thực sự phụ thuộc vào một giải pháp khác, nhưng bạn có thể thực hiện các bản dựng tự động của mình theo một thứ tự phù hợp thông qua các tập lệnh tùy chỉnh. Về cơ bản đối xử với thư viện chung của bạn như thể đó là một sự phụ thuộc của bên thứ ba khác như NUnit, v.v.


Dự án có theo dõi nơi các gói nuget được lưu trữ và điều này có thể được thay đổi bằng cách mở giải pháp có thể dẫn đến đau đầu khi xây dựng nên đây là một giải pháp thích hợp hơn.
Shane Courtrille

23

Bạn có thể sử dụng nội tuyến thẻ đại diện bằng cách sử dụng kỹ thuật sau (đây là cách lưu giải pháp của @ Andomar trong .csproj)

<Compile Include="..\MySisterProject\**\*.cs">
  <Link>_Inlined\MySisterProject\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Compile>

Đưa vào:

    <Visible>false</Visible>

Nếu bạn muốn ẩn các tập tin và / hoặc ngăn chặn thẻ đại diện bao gồm mở rộng nếu bạn thêm hoặc xóa một mục khỏi thư mục 'mục hiện có ảo' như MySisterProjecttrên.


Đẹp một. Đây có vẻ là một giải pháp nhẹ, đẹp, nếu bạn tha thứ cho trò chơi chữ.
CAD bloke

@Cad bloke: Nó chắc chắn hoạt động ổn (cũng như cách chơi chữ của bạn :), nhưng có rất nhiều điều phải nói để làm hết sức để tránh các liên kết ở nơi đầu tiên
Ruben Bartelink

2
@CAD Bloke: Vâng, đó là một niềm vui. Để rõ ràng, tôi sẽ nói rõ ràng những điều sau đây trong trường hợp nó giúp được ai đó ... Bạn có thể dỡ / tải lại dự án để nhận dự án thay đổi. (Alt-P, L hai lần). Vấn đề của VS2010 là các tệp .target v.v. <Importthành các tệp .csproj được lưu vào bộ đệm cho đến khi bạn tải lại các giải pháp như bạn nói.
Ruben Bartelink

3
Đây là phiên bản mới nhất của chủ đề ký tự đại diện ... <Compile Bao gồm = ".._ Src * *. " Loại trừ = ".._ Src \ Properties \ HộiInfo.cs; .._ Src \ bin * * . ; .._ Src \ obj * * . ; .._ Src ***. Csproj; .._ Src ***. User; .._ Src ***. Vstemplate "> <Link> Src \% (RecursiveDir)% (Tên tệp)% (Gia hạn) < / Liên kết> </ Biên dịch>
CAD bloke

1
@ChrisK Dưới đây là một số giải thích rõ hơn về các chỉnh sửa của tôi trong tệp csproj ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . Tôi chỉ chỉnh sửa nó trong Notepad ++. Khi tôi lưu nó, VS thấy nó đã thay đổi và yêu cầu tải lại. Có các cài đặt trong VS để kiểm soát hành vi này.
CAD bloke

18

Bạn chỉ cần tạo một dự án Thư viện lớp riêng để chứa mã chung. Nó không cần phải là một phần của bất kỳ giải pháp sử dụng nó. Tham khảo thư viện lớp từ bất kỳ dự án cần nó.

Bí quyết duy nhất là bạn sẽ cần sử dụng một tham chiếu tệp để tham chiếu dự án, vì nó sẽ không phải là một phần của các giải pháp đề cập đến nó. Điều này có nghĩa là lắp ráp đầu ra thực tế sẽ phải được đặt ở một vị trí có thể được truy cập bởi bất kỳ ai xây dựng dự án tham chiếu đến nó. Điều này có thể được thực hiện bằng cách đặt hội đồng trên một chia sẻ, ví dụ.


Tôi đoán nếu tôi tạo một sự kiện xây dựng và xuất bản dll vào thư mục _lib được kiểm soát nguồn trong dự án tham chiếu, sau đó kiểm tra xem DLL đó có hoạt động không .. có vẻ như là hacky tho ..
hanzolo

1
Nếu bạn muốn kiểm soát nguồn mọi bản dựng, thì bạn có thể có mục tiêu bản dựng kiểm tra các dll thư viện, sao chép từ các bản dựng đầu ra vào các thư mục thư viện, sau đó kiểm tra các dll.
John Saunders

8

Bạn có thể bao gồm cùng một dự án trong nhiều giải pháp, nhưng đôi khi bạn được đảm bảo sẽ gặp sự cố (đường dẫn tương đối có thể trở nên không hợp lệ khi bạn di chuyển các thư mục xung quanh chẳng hạn)

Sau nhiều năm vật lộn với điều này, cuối cùng tôi đã tìm ra một giải pháp khả thi, nhưng nó yêu cầu bạn sử dụng Subversion để kiểm soát nguồn (đây không phải là điều xấu)

Ở cấp thư mục của giải pháp của bạn, hãy thêm thuộc tính svn: externals trỏ đến các dự án bạn muốn đưa vào giải pháp của mình. Subversion sẽ kéo dự án từ kho lưu trữ và lưu trữ nó trong thư mục con của tệp giải pháp của bạn. Tệp giải pháp của bạn có thể chỉ cần sử dụng các đường dẫn tương đối để tham chiếu đến dự án của bạn.

Nếu tôi tìm thấy thêm thời gian, tôi sẽ giải thích chi tiết điều này.


Khi xác định các dự án của bạn, hãy đảm bảo chỉ sử dụng các đường dẫn tương đối ... Điều đó, đặc biệt đối với một dự án có thể tái sử dụng, giải quyết nhiều hơn một vấn đề nhỏ.
xtofl

5
Chỉ để tham khảo, svn:externalsliên kết cứng đến một kho lưu trữ. Khi bạn di chuyển kho lưu trữ, các liên kết bên ngoài vẫn trỏ đến kho lưu trữ cũ.
Andomar

Đối với git, bạn có thể sử dụng SubTree SVN: externals tương đương trong GIT?
Michael Freidgeim

8

Trích xuất mã chung vào một dự án thư viện lớp và thêm dự án thư viện lớp đó vào các giải pháp của bạn. Sau đó, bạn có thể thêm một tham chiếu đến mã chung từ các dự án khác bằng cách thêm một tham chiếu dự án vào thư viện lớp đó. Ưu điểm của việc có một tham chiếu dự án trái ngược với tham chiếu nhị phân / lắp ráp là nếu bạn thay đổi cấu hình xây dựng của mình thành gỡ lỗi, phát hành, tùy chỉnh, v.v., dự án thư viện lớp chung cũng sẽ được xây dựng dựa trên cấu hình đó.


5

Đó là một ý tưởng tốt để tạo một thư viện lớp dll có chứa tất cả các chức năng phổ biến. Mỗi giải pháp có thể tham chiếu dll này một cách độc lập bất kể các giải pháp khác.

Nguyên vẹn, đây là cách các nguồn của chúng tôi được tổ chức trong công việc của tôi (và tôi tin ở nhiều nơi khác).

Nhân tiện, Solution không thể phụ thuộc rõ ràng vào một giải pháp khác.


1
Tôi tin rằng đây là một trong những điểm lớn nhất của câu hỏi mà một tấn người rõ ràng không nhận được.
Del Lee

5

Hai bước chính liên quan là

1- Tạo một dll C ++

Trong phòng thu hình

New->Project->Class Library in c++ template. Name of project here is first_dll in 
visual studio 2010. Now declare your function as public in first_dll.h file and 
write the code in first_dll.cpp file as shown below.

Mã tệp tiêu đề

// first_dll.h

using namespace System;

namespace first_dll 
{

public ref class Class1
{
public:
    static double sum(int ,int );
    // TODO: Add your methods for this class here.
};
}

Tập tin Cpp

//first_dll.cpp
#include "stdafx.h"

#include "first_dll.h"

namespace first_dll
{

    double Class1:: sum(int x,int y)
    {
        return x+y;
    }

 }

Kiểm tra điều này

**Project-> Properties -> Configuration/General -> Configuration Type** 

tùy chọn này phải là Thư viện động (dll) và xây dựng giải pháp / dự án ngay bây giờ.

Tệp First_dll.dll được tạo trong thư mục Gỡ lỗi

2- Liên kết nó trong dự án C #

Mở dự án C #

Rightclick on project name in solution explorer -> Add -> References -> Browse to path 
where first_dll.dll is created and add the file.

Thêm dòng này ở đầu trong dự án C #

Using first_dll; 

Bây giờ chức năng từ dll có thể được truy cập bằng cách sử dụng câu lệnh dưới đây trong một số chức năng

double var = Class1.sum(4,5);

Tôi đã tạo dll trong dự án c ++ trong VS2010 và sử dụng nó trong dự án C # của VS2013. Nó hoạt động tốt.



4

Nếu bạn đang cố gắng chia sẻ mã giữa hai loại dự án khác nhau (Tức là: dự án máy tính để bàn và dự án di động), bạn có thể xem xét thư mục giải pháp được chia sẻ . Tôi phải làm điều đó cho dự án hiện tại của tôi vì cả hai dự án di động và máy tính để bàn đều yêu cầu các lớp giống hệt nhau chỉ trong 1 tệp. Nếu bạn đi theo lộ trình này, bất kỳ dự án nào có tệp được liên kết đều có thể thay đổi nó và tất cả các dự án sẽ được xây dựng lại theo những thay đổi đó.


Làm thế nào mà làm việc Stevoni? Bạn có thể cung cấp thêm thông tin?
Steve Dunn

@SteveDunn Tôi đã đăng một hướng dẫn trên blog rất hiếm khi được cập nhật của tôi (trường học và công việc ngu ngốc cản trở những điều thú vị trong cuộc sống). Nó có thể được tìm thấy ở đây
Stevoni

4

Có một trường hợp rất tốt để sử dụng "thêm liên kết tệp hiện có" khi sử dụng lại mã trên các dự án và đó là khi bạn cần tham khảo và hỗ trợ các phiên bản khác nhau của thư viện phụ thuộc.

Tạo nhiều tập hợp với các tham chiếu đến các tập hợp bên ngoài khác nhau không dễ thực hiện nếu không sao chép mã của bạn hoặc sử dụng các thủ thuật với kiểm soát mã nguồn.

Tôi tin rằng dễ dàng nhất để duy trì một dự án để phát triển và thử nghiệm đơn vị, sau đó tạo các dự án 'xây dựng' bằng các liên kết tệp hiện có khi bạn cần tạo các hội đồng tham chiếu các phiên bản khác nhau của các hội đồng bên ngoài đó.


2

Một cách đơn giản hơn để bao gồm một tệp lớp của một dự án trong các dự án khác là bằng cách Thêm dự án vào giải pháp hiện có và sau đó Thêm tham chiếu DLL của dự án mới trong dự án hiện có. Cuối cùng, bạn có thể sử dụng các phương thức của lớp được thêm bằng cách dán decal bằng chỉ thị ở đầu bất kỳ lớp nào.


2

Kể từ VisualStudio 2015, nếu bạn giữ tất cả mã của mình trong một giải pháp, bạn có thể chia sẻ mã bằng cách thêm một dự án được chia sẻ . Sau đó thêm một tham chiếu đến dự án được chia sẻ này cho từng dự án bạn muốn sử dụng mã, cũng như các chỉ thị sử dụng phù hợp.


2

Bây giờ bạn có thể sử dụng Dự án được chia sẻ

Shared Project là một cách tuyệt vời để chia sẻ mã phổ biến trên nhiều ứng dụng Chúng tôi đã trải nghiệm với loại Dự án được chia sẻ trong Visual Studio 2013 như một phần của Phát triển ứng dụng phổ biến Windows 8.1, nhưng với Visual Studio 2015, đó là Mẫu dự án mới độc lập; và chúng ta có thể sử dụng nó với các loại ứng dụng khác như Console, Desktop, Phone, Store App, v.v. Loại dự án này cực kỳ hữu ích khi chúng ta muốn chia sẻ một mã chung, logic cũng như các thành phần trên nhiều ứng dụng trong cùng một nền tảng . Điều này cũng cho phép truy cập các tài sản, API cụ thể của nền tảng, v.v.

nhập mô tả hình ảnh ở đây

để biết thêm thông tin kiểm tra này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.