คุณแชร์รหัสระหว่างโครงการ / โซลูชันใน Visual Studio ได้อย่างไร


229

ฉันมีสองวิธีที่มีรหัสทั่วไปดังนั้นฉันต้องการแยกออกและแบ่งปันระหว่างกัน นอกจากนี้ฉันต้องการที่จะเผยแพร่ห้องสมุดด้วยตนเองเพราะอาจเป็นประโยชน์กับผู้อื่น

  • วิธีที่ดีที่สุดในการทำกับ Visual Studio 2008 คืออะไร
  • มีโครงการในโซลูชันมากกว่าหนึ่งวิธีหรือไม่?
  • ฉันมีโซลูชันแยกต่างหากสำหรับโค้ดแยกชิ้นหรือไม่
  • วิธีการแก้ปัญหาสามารถขึ้นอยู่กับอีกคนหนึ่ง?

15
2014 มัน Nuget คือคำตอบ
Ravi

1
@Ravi ฉันต้องการทำให้เว็บแอปพลิเคชั่น Visual Studio เป็นโมดูลที่พัฒนาขึ้นที่สำนักงานของฉันอย่างไรก็ตามเมื่อฉันพยายามคิดว่าการทำให้เว็บแอพพลิเคชั่นของ Visual Studio เป็นโมดูลเป็นเว็บแอปพลิเคชันที่แตกต่างกัน ไม่สามารถทำให้เป็นมาตรฐานโครงการ POCO สำหรับแต่ละแอปพลิเคชันเว็บที่วางแผนไว้เนื่องจากมีการพึ่งพามากเกินไป มีวิธีที่ฉันสามารถใช้ Nuget เพื่อช่วยในการปรับให้เป็นโมดูลหรือไม่?
CS Lewis

คำตอบ:


70

สามารถอ้างอิงโครงการได้หลายวิธี

ใส่ไลบรารี่หรือรหัสแกนของคุณลงในโครงการเดียวจากนั้นอ้างอิงโครงการนั้นในโซลูชันทั้งสอง


150
ตกลง แต่อย่างไร คำแนะนำบางอย่าง?
cja

2
คำตอบ (เก่า) นี้ไม่สมบูรณ์ด้วยตัวเองเนื่องจากส่งผลให้หลายชุดประกอบ: อย่างไรก็ตามเมื่อรวมกับ ILMerge - โดยเฉพาะอย่างยิ่งกับตัวเลือก internalize - มันกลายเป็นโซลูชั่นที่ทรงพลังมาก
user2246674

2
@ user2246674: ทำไมมันไม่สมบูรณ์เพราะมีหลายแอสเซมบลี OP ไม่ได้พูดอะไรเกี่ยวกับชุดประกอบเดียว
John Saunders

1
@Jfly: การเปลี่ยนชื่อสิ่งที่ไม่เปิดเผยต่อสาธารณะจะไม่ส่งผลกระทบต่อโค้ดภายนอก การเปลี่ยนชื่อสิ่งที่เป็นสาธารณะควรทำที่ทุกโครงการโดยใช้รหัสทั่วไปและรหัสทั่วไปตัวเองอยู่ในโซลูชั่นเดียว คุณสามารถสร้างโซลูชัน "ต้นแบบ" ด้วยตนเองที่มีโครงการเหล่านี้ทั้งหมดและใช้สำหรับวัตถุประสงค์นี้เท่านั้น
John Saunders

1
ขึ้นอยู่กับความหมายของคุณโดยอินสแตนซ์อื่น คุณอาจเริ่มต้นคำถามใหม่ด้วยรายละเอียดเพิ่มเติมได้ดี
ilivewithian

248

คุณสามารถ "ลิงก์" ไฟล์รหัสระหว่างสองโครงการ คลิกขวาที่โครงการของคุณเลือกAdd-> Existing itemจากนั้นคลิกลูกศรลงถัดจากAddปุ่ม:

Screengrab

ในประสบการณ์ของฉันการเชื่อมโยงนั้นง่ายกว่าการสร้างห้องสมุด โค้ดที่เชื่อมโยงจะส่งผลให้สามารถเรียกใช้งานได้ในเวอร์ชันเดียว


9
น่ารัก - นั่นคือคำตอบที่ฉันต้องการ ฉันไม่ต้องการคอลเล็กชัน DLLs ไชโย
CAD bloke

63
ทำไมคุณต้องทำแบบนี้? นี่คือเหตุผลที่เรามีห้องสมุดการห่อหุ้ม ฉันไม่เห็นความรู้สึกทางธุรกิจหรือเหตุผลอย่างสมเหตุสมผลว่าทำไมคุณถึงทำเช่นนี้
Ryan Ternier

16
นอกจากนี้ลิงก์ของคุณอาจไม่อยู่ภายใต้การควบคุมของแหล่งเดียวกัน นี่เป็นคำแนะนำที่อันตรายมาก
Kugel

11
มีหลายสถานการณ์ที่โซลูชันนี้มีประโยชน์ เป็นตัวอย่างที่ฉันพัฒนาใน InfoPath 2007 ซึ่งไม่ตรงไปตรงมาเพื่อปรับใช้ DLL แยกต่างหากใน SharePoint เพื่อที่จะแบ่งปันการใช้งานทั่วไประหว่าง InfoPath ในรูปแบบไฟล์คลาสที่เชื่อมโยงนั้นมีประโยชน์มาก มันถูกวางไว้หนึ่งระดับเหนือโครงการแต่ละรูปแบบและทุกอย่างจะถูกควบคุมในระดับราก
Oliver Grey

6
อีกตัวอย่างหนึ่งของประโยชน์บอกว่าคุณกำลังพัฒนาสองแอปพลิเคชันที่ต้องสื่อสารซึ่งกันและกัน หนึ่งคือ 64 บิตและอีก 32 คือดังนั้นคุณไม่จำเป็นต้องแยกต่างหากที่กำลังสร้างจากรหัสเดียวกันในการอ้างอิงแบบฟอร์มแต่ละโครงการ วิธีนี้คุณสามารถเลียนแบบฟังก์ชันการทำงานของ c โดยใช้ไฟล์. h
user912447

33

File > Add > Existing Project...จะช่วยให้คุณเพิ่มโครงการในโซลูชันปัจจุบันของคุณ เพียงเพิ่มสิ่งนี้เนื่องจากไม่มีการโพสต์ข้างต้นชี้ให้เห็นว่า สิ่งนี้ช่วยให้คุณรวมโครงการเดียวกันในหลาย ๆ โซลูชัน


1
มันใช้งานได้ ข้อเสียคือไม่ได้สร้างโครงการทั้งสองเป็นแอสเซมบลีเดียว
เอียนบอยด์

24

คุณสามารถรวมโครงการในโซลูชันมากกว่าหนึ่งรายการ ฉันไม่คิดว่าโครงการมีแนวคิดว่าโซลูชันเป็นส่วนหนึ่งของอะไร อย่างไรก็ตามทางเลือกอื่นคือการสร้างโซลูชันแรกให้กับสถานที่ที่มีชื่อเสียงและอ้างอิงไบนารีที่รวบรวม สิ่งนี้มีข้อเสียที่คุณจะต้องทำงานสักหน่อยหากคุณต้องการอ้างอิงเวอร์ชันที่แตกต่างกันโดยขึ้นอยู่กับว่าคุณกำลังสร้างการกำหนดค่าในรุ่นหรือ debug

ฉันไม่เชื่อว่าคุณสามารถสร้างโซลูชันหนึ่งได้จริงขึ้นอยู่กับโซลูชันอื่น แต่คุณสามารถดำเนินการสร้างอัตโนมัติตามลำดับที่เหมาะสมผ่านสคริปต์ที่กำหนดเอง โดยทั่วไปถือว่าห้องสมุดทั่วไปของคุณราวกับว่าเป็นการพึ่งพาบุคคลที่สามเช่น NUnit ฯลฯ


โปรเจ็กต์มีแทร็กที่จัดเก็บแพ็กเกจ nuget และสามารถเปลี่ยนแปลงได้โดยการเปิดโซลูชันซึ่งสามารถนำไปสู่อาการปวดหัวในเวลาที่สร้างดังนั้นนี่จึงเป็นโซลูชันที่ดีกว่า
Shane Courtrille

23

คุณสามารถแทรกไวด์การ์ดโดยใช้เทคนิคต่อไปนี้ (ซึ่งเป็นวิธีที่โซลูชันของ @ Andomar บันทึกไว้ใน. csproj)

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

ใส่ใน:

    <Visible>false</Visible>

หากคุณต้องการซ่อนไฟล์และ / หรือป้องกันการขยายรวมถึงไวด์การ์ดหากคุณเพิ่มหรือลบรายการออกจากโฟลเดอร์ 'รายการที่มีอยู่เสมือน' ดังกล่าวMySisterProjectข้างต้น


ทำได้ดีนี่. ดูเหมือนว่าจะเป็นวิธีแก้ปัญหาที่ดีและมีน้ำหนักเบาถ้าคุณจะอภัยโทษ
CAD bloke

@Cad bloke: มันแน่ใจว่าทำงานได้ดี (เช่นเดียวกับคุณปุน :) แต่มีจำนวนมากที่จะกล่าวว่าสำหรับการทำอย่างเต็มที่เพื่อหลีกเลี่ยงการเชื่อมโยงในสถานที่แรก
Ruben Bartelink

2
@CAD Bloke: ใช่แล้วมันสนุก เพื่อความชัดเจนฉันจะพูดสิ่งต่อไปนี้อย่างชัดเจนในกรณีที่ช่วยใครบางคน ... คุณสามารถยกเลิกการโหลด / โหลดซ้ำโครงการเพื่อให้ได้รับการเปลี่ยนแปลง (Alt-P, L สองครั้ง) ปัญหา VS2010 คือไฟล์. target และอื่น ๆ ที่ถูก<Importแปลงเป็นไฟล์. csproj จะถูกเก็บไว้จนกว่าคุณจะทำการรีโหลดโซลูชันตามที่คุณพูด
Ruben Bartelink

3
นี่คือธีมล่าสุดของฉันในรูปแบบไวด์การ์ด ... <คอมไพล์รวม = ".._ Src * *. " ยกเว้น = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * *.. .. Src \ obj * * .; .._ Src ***. csproj; .._ Src ***. ผู้ใช้; .. Src ***. vstemplate "> <Link> Src \% (RecursiveDir)% (ชื่อไฟล์)% (นามสกุล) < / Link> </Compile>
CAD bloke

1
@ChrisK นี่คือบางส่วนชี้แจงเพิ่มเติมเกี่ยวกับการแก้ไขของฉันในไฟล์ csproj ... การtheswamp.org/index.php?topic=41850.msg472902#msg472902 ฉันเพิ่งแก้ไขใน Notepad ++ เมื่อฉันบันทึก VS พบว่ามีการเปลี่ยนแปลงและขอให้โหลดซ้ำ มีการตั้งค่าใน VS เพื่อควบคุมพฤติกรรมนี้
CAD bloke

18

คุณเพียงแค่สร้างโครงการ Class Library แยกต่างหากเพื่อให้มีรหัสทั่วไป ไม่จำเป็นต้องเป็นส่วนหนึ่งของโซลูชันที่ใช้งาน อ้างอิงไลบรารีคลาสจากโครงการใด ๆ ที่ต้องการ

เคล็ดลับเพียงประการเดียวคือคุณจะต้องใช้การอ้างอิงไฟล์เพื่ออ้างอิงโครงการเนื่องจากจะไม่เป็นส่วนหนึ่งของโซลูชันที่อ้างถึง ซึ่งหมายความว่าจะต้องวางแอสเซมบลีเอาท์พุทจริงในตำแหน่งที่ทุกคนสามารถสร้างโครงการที่อ้างอิงได้ ซึ่งสามารถทำได้โดยการวางชุดประกอบบนการแชร์เช่น


ผมคิดว่าถ้าผมสร้างสร้างเหตุการณ์และเผยแพร่ dll ลงในแหล่งควบคุมโฟลเดอร์ _lib ในโครงการอ้างอิงแล้วตรวจสอบในที่ DLL มันจะทำงาน .. ดูเหมือนว่าชนิดของสรรพ hacky ..
hanzolo

1
หากคุณต้องการควบคุมแหล่งที่มาของบิลด์ทุกรุ่นคุณสามารถกำหนดเป้าหมายบิลด์ได้จากไลบรารี่ของไลบรารีคัดลอกจากบิลด์เอาต์พุตไปยังโฟลเดอร์ไลบรารีจากนั้นเช็คอิน dll
John Saunders

8

คุณสามารถรวมโครงการเดียวกันในโซลูชันมากกว่าหนึ่งวิธี แต่คุณรับประกันว่าจะพบปัญหาในบางครั้งตามถนน (เส้นทางสัมพัทธ์อาจกลายเป็นโมฆะเมื่อคุณย้ายไดเรกทอรีไปมาเป็นต้น)

หลังจากหลายปีของการดิ้นรนกับสิ่งนี้ในที่สุดฉันก็คิดวิธีแก้ปัญหาที่ใช้การได้ แต่คุณต้องใช้ Subversion เพื่อควบคุมซอร์ส (ซึ่งไม่ใช่เรื่องเลวร้าย)

ที่ระดับไดเร็กทอรีของโซลูชันของคุณเพิ่มคุณสมบัติsvn: externals ที่ชี้ไปยังโครงการที่คุณต้องการรวมไว้ในโซลูชันของคุณ การโค่นล้มจะดึงโครงการจากพื้นที่เก็บข้อมูลและเก็บไว้ในโฟลเดอร์ย่อยของไฟล์โซลูชันของคุณ ไฟล์โซลูชันของคุณสามารถใช้พา ธ สัมพัทธ์เพื่ออ้างถึงโครงการของคุณ

หากฉันหาเวลาเพิ่มเติมฉันจะอธิบายรายละเอียดนี้


ในการกำหนดโครงการของคุณตรวจสอบให้แน่ใจว่าใช้เส้นทางสัมพันธ์เท่านั้น ... โดยเฉพาะอย่างยิ่งสำหรับโครงการที่ใช้ซ้ำได้ควรแก้ปัญหามากกว่าปัญหาเล็ก ๆ
xtofl

5
เพียงเพื่อการอ้างอิงsvn:externalsฮาร์ดลิงก์ไปยังที่เก็บ เมื่อคุณย้ายที่เก็บลิงค์ภายนอกยังคงชี้ไปที่ที่เก็บเก่า
Andomar


8

แยกรหัสทั่วไปลงในโครงการไลบรารีคลาสและเพิ่มโครงการไลบรารีคลาสนั้นลงในโซลูชันของคุณ จากนั้นคุณสามารถเพิ่มการอ้างอิงไปยังรหัสทั่วไปจากโครงการอื่น ๆ โดยเพิ่มการอ้างอิงโครงการในไลบรารีคลาสนั้น ข้อดีของการมีการอ้างอิงโครงการเมื่อเทียบกับการอ้างอิงแบบไบนารี / แอสเซมบลีคือถ้าคุณเปลี่ยนการกำหนดค่าการสร้างของคุณเป็น debug, release, custom, etc โครงการไลบรารีคลาสทั่วไปจะถูกสร้างขึ้นตามการกำหนดค่านั้นเช่นกัน


5

เป็นความคิดที่ดีที่จะสร้างไลบรารีคลาส dll ที่มีฟังก์ชันการทำงานทั่วไปทั้งหมด แต่ละวิธีแก้ปัญหาสามารถอ้างอิง dll นี้อย่างอิสระโดยไม่คำนึงถึงโซลูชันอื่น

Infact นี่คือวิธีที่แหล่งข้อมูลของเราถูกจัดระเบียบในงานของฉัน (และฉันเชื่อในที่อื่น ๆ )

โดยวิธีการแก้ปัญหาไม่สามารถขึ้นอยู่กับการแก้ปัญหาอื่นอย่างชัดเจน


1
ฉันเชื่อว่านี่เป็นหนึ่งในประเด็นที่ยิ่งใหญ่ที่สุดของคำถามที่คนจำนวนมากไม่เข้าใจ
Del Lee

5

สองขั้นตอนหลักที่เกี่ยวข้องคือ

1- การสร้าง C ++ dll

ในสตูดิโอภาพ

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.

รหัสไฟล์ส่วนหัว

// 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.
};
}

ไฟล์ Cpp

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

#include "first_dll.h"

namespace first_dll
{

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

 }

เลือกที่นี่

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

ตัวเลือกนี้ควรเป็นDynamic Library (.dll)และสร้างโซลูชัน / โครงการทันที

ไฟล์first_dll.dllถูกสร้างขึ้นในโฟลเดอร์ Debug

2- เชื่อมโยงมันในโครงการ C #

เปิดโครงการ C #

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

เพิ่มบรรทัดนี้ที่ด้านบนในโครงการ C #

Using first_dll; 

ตอนนี้ฟังก์ชั่นจาก dll สามารถเข้าถึงได้โดยใช้คำสั่งด้านล่างในบางฟังก์ชั่น

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

ฉันสร้าง dll ใน c ++ project ใน VS2010 และใช้ใน VS2013 C # project มันทำงานได้ดี



4

หากคุณกำลังพยายามที่จะรหัสร่วมกันระหว่างสองประเภทต่าง ๆ โครงการ (เช่น: โครงการสก์ท็อปและโครงการมือถือ), คุณอาจมองเข้าไปที่ใช้ร่วมกันโฟลเดอร์การแก้ปัญหา ฉันต้องทำเช่นนั้นสำหรับโครงการปัจจุบันของฉันเนื่องจากโปรเจ็กต์มือถือและเดสก์ท็อปนั้นต้องการคลาสที่เหมือนกันซึ่งมีเพียง 1 ไฟล์เท่านั้น หากคุณไปที่เส้นทางนี้โครงการใด ๆ ที่มีไฟล์เชื่อมโยงสามารถทำการเปลี่ยนแปลงได้และโครงการทั้งหมดจะถูกสร้างขึ้นใหม่จากการเปลี่ยนแปลงเหล่านั้น


Stevoni นั้นทำงานอย่างไร คุณสามารถให้ข้อมูลเพิ่มเติมได้หรือไม่
Steve Dunn

@SteveDunn ฉันโพสต์วิธีการในบล็อกที่ไม่ค่อยมีการปรับปรุงมาก (โรงเรียนที่โง่และทำงานได้ในทางของสิ่งที่สนุกในชีวิต) พบได้ที่นี่
Stevoni

4

มีกรณีที่ดีมากสำหรับการใช้ "เพิ่มลิงค์ไฟล์ที่มีอยู่" เมื่อใช้รหัสซ้ำในโครงการต่าง ๆ และนั่นคือเมื่อคุณต้องการอ้างอิงและสนับสนุนไลบรารีที่ขึ้นต่อกันรุ่นต่าง ๆ

การสร้างแอสเซมบลีหลายตัวโดยอ้างอิงจากแอสเซมบลีภายนอกที่แตกต่างกันไม่ใช่เรื่องง่ายที่จะทำอย่างอื่นโดยไม่ต้องทำซ้ำรหัสของคุณหรือใช้เทคนิคที่มีการควบคุมซอร์สโค้ด

ฉันเชื่อว่ามันง่ายที่สุดในการรักษาหนึ่งโครงการสำหรับการพัฒนาและการทดสอบหน่วยจากนั้นสร้างโครงการ 'สร้าง' โดยใช้ลิงก์ไฟล์ที่มีอยู่เมื่อคุณต้องการสร้างชุดประกอบที่อ้างอิงรุ่นต่าง ๆ ของชุดประกอบภายนอกเหล่านั้น


2

วิธีที่ง่ายกว่าวิธีหนึ่งในการรวมไฟล์คลาสของหนึ่งโครงการในโครงการอื่นคือการเพิ่มโครงการในโซลูชันที่มีอยู่แล้วเพิ่มการอ้างอิง DLL ของโครงการใหม่ในโครงการที่มีอยู่ ในที่สุดคุณสามารถใช้วิธีการของชั้นเรียนที่เพิ่มขึ้นโดย decalring โดยใช้คำสั่งที่ด้านบนของชั้นเรียนใด ๆ


2

ในฐานะของ VisualStudio 2015 ถ้าคุณเก็บรหัสของคุณทั้งหมดในการแก้ปัญหาหนึ่งที่คุณสามารถแบ่งปันรหัสโดยการเพิ่มโครงการที่ใช้ร่วมกัน จากนั้นเพิ่มการอ้างอิงถึงโครงการที่ใช้ร่วมกันนี้สำหรับแต่ละโครงการที่คุณต้องการใช้รหัสในเช่นเดียวกับการใช้คำสั่งที่เหมาะสม


2

ตอนนี้คุณสามารถใช้โครงการที่ใช้ร่วมกัน

โครงการที่ใช้ร่วมกันเป็นวิธีที่ยอดเยี่ยมในการแบ่งปันรหัสทั่วไปในแอพพลิเคชั่นหลาย ๆ ตัวเราเคยพบกับประเภทโครงการที่ใช้ร่วมกันใน Visual Studio 2013 ซึ่งเป็นส่วนหนึ่งของการพัฒนาแอพสากล Windows 8.1 แต่ด้วย Visual Studio 2015 มันเป็นเทมเพลตโครงการใหม่ และเราสามารถใช้กับแอพประเภทอื่น ๆ เช่นคอนโซลเดสก์ท็อปโทรศัพท์แอพสโตร์ ฯลฯ โครงการประเภทนี้มีประโยชน์อย่างยิ่งเมื่อเราต้องการแบ่งปันรหัสทั่วไปตรรกะรวมถึงส่วนประกอบต่างๆในแอพพลิเคชั่นหลายตัวในแพลตฟอร์มเดียว . นอกจากนี้ยังอนุญาตให้เข้าถึง API ของสินทรัพย์และแพลตฟอร์มเฉพาะ

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับข้อมูลเพิ่มเติมตรวจสอบสิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.