Bagaimana Anda membagikan kode antar proyek / solusi di Visual Studio?


229

Saya punya dua solusi yang memiliki beberapa kode umum, jadi saya ingin mengekstraknya dan membaginya di antara mereka. Selain itu, saya ingin dapat melepaskan perpustakaan itu secara mandiri karena mungkin bermanfaat bagi orang lain.

  • Apa cara terbaik untuk melakukannya dengan Visual Studio 2008?
  • Apakah proyek hadir dalam lebih dari satu solusi?
  • Apakah saya memiliki solusi terpisah untuk bagian kode yang terpisah?
  • Bisakah solusi bergantung pada yang lain?

15
Ini 2014. Nuget adalah jawabannya.
Ravi

1
@Ravi Saya ingin memodulasi Aplikasi Visual Studio Web yang dikembangkan di kantor saya. Namun, ketika saya mencoba memikirkan memodulasi Aplikasi Visual Studio Web ke dalam Aplikasi Web yang berbeda, ketergantungan melingkar antara komponen muncul yang salah. Misalnya, saya tidak dapat memodulasi proyek POCO untuk masing-masing Aplikasi Web yang direncanakan karena ada terlalu banyak ketergantungan. Apakah ada cara saya bisa menggunakan Nuget untuk membantu Modularisasi?
CS Lewis

Jawaban:


70

Sebuah proyek dapat dirujuk oleh beberapa solusi.

Masukkan pustaka atau kode inti Anda ke dalam satu proyek, kemudian rujuk proyek itu di kedua solusi.


150
OK tapi bagaimana? Beberapa instruksi?
cja

2
Jawaban (lama) ini tidak lengkap dengan sendirinya karena menghasilkan banyak majelis: namun, ketika digabungkan dengan ILMerge - terutama dengan opsi internalisasi - ini menjadi solusi yang sangat kuat.
user2246674

2
@ user2246674: mengapa tidak lengkap karena banyak majelis? OP tidak mengatakan apapun tentang satu perakitan.
John Saunders

1
@ Jfly: Mengganti nama hal-hal yang tidak terlihat oleh publik tidak akan memengaruhi kode luar. Mengganti nama hal-hal yang yang terlihat publik hanya boleh dilakukan di mana semua proyek menggunakan kode umum, dan kode umum itu sendiri, berada dalam solusi tunggal. Anda dapat secara manual membuat solusi "master" yang berisi semua proyek ini, dan yang hanya digunakan untuk tujuan ini.
John Saunders

1
Itu tergantung apa yang Anda maksud dengan contoh lain. Anda mungkin sebaiknya memulai pertanyaan baru dengan beberapa perincian lebih lanjut.
ilivewithian

248

Anda dapat "menautkan" file kode antara dua proyek. Klik kanan proyek Anda, pilih Add-> Existing item, lalu klik panah bawah di sebelah Addtombol:

Screengrab

Dalam pengalaman saya, menautkan lebih mudah daripada membuat perpustakaan. Kode tertaut menghasilkan satu executable tunggal dengan versi tunggal.


9
Manis - itulah jawaban yang saya cari. Saya tidak ingin koleksi DLL. Cheers
CAD cowok

63
Mengapa Anda melakukannya dengan cara ini? Inilah sebabnya kami memiliki perpustakaan, enkapsulasi. Saya tidak melihat alasan bisnis, atau alasan logis mengapa Anda melakukan ini.
Ryan Ternier

16
Selain itu, tautan Anda mungkin tidak berada di bawah kendali sumber yang sama. Ini saran yang sangat berbahaya.
Kugel

11
Ada situasi di mana solusi ini bermanfaat. Sebagai contoh saya mengembangkan di InfoPath 2007 di mana tidak mudah untuk menggunakan DLL terpisah ke SharePoint. Untuk berbagi fungsionalitas umum antara formulir InfoPath, pendekatan file kelas tertaut sangat berguna. Itu ditempatkan satu tingkat di atas proyek formulir individu dan semuanya dikendalikan sumber di tingkat root.
Oliver Gray

6
Sebagai contoh lain dari kegunaan mengatakan bahwa Anda sedang mengembangkan dua aplikasi yang perlu berkomunikasi satu sama lain. Satu adalah 64 bit dan yang lainnya adalah 32 sehingga Anda tidak perlu ingin dll terpisah dibangun dari kode yang sama untuk referensi dari setiap proyek. Dengan cara ini Anda dapat meniru fungsi c menggunakan file .h.
user912447

33

File > Add > Existing Project...akan memungkinkan Anda menambahkan proyek ke solusi Anda saat ini. Hanya menambahkan ini karena tidak ada tulisan di atas yang menunjukkan hal itu. Ini memungkinkan Anda memasukkan proyek yang sama dalam beberapa solusi.


1
Ini berhasil; pada sisi negatifnya itu tidak membangun kedua proyek menjadi satu perakitan.
Ian Boyd

24

Anda dapat memasukkan proyek dalam lebih dari satu solusi. Saya tidak berpikir proyek memiliki konsep solusi yang menjadi bagiannya. Namun, alternatif lain adalah membuat solusi pertama dibangun ke beberapa tempat terkenal, dan referensi biner yang dikompilasi. Ini memiliki kelemahan yaitu Anda harus melakukan sedikit pekerjaan jika Anda ingin mereferensikan versi yang berbeda berdasarkan apakah Anda sedang membangun konfigurasi rilis atau debug.

Saya tidak percaya Anda dapat membuat satu solusi yang benar-benar bergantung pada yang lain, tetapi Anda dapat melakukan pembuatan otomatis Anda dalam urutan yang sesuai melalui skrip khusus. Pada dasarnya memperlakukan perpustakaan umum Anda seolah-olah itu ketergantungan pihak ketiga lain seperti NUnit dll.


Proyek ini memang memiliki track di mana paket nuget disimpan dan ini dapat diubah dengan pembukaan solusi yang dapat menyebabkan sakit kepala pada waktu pembangunan sehingga ini adalah solusi yang lebih disukai.
Shane Courtrille

23

Anda bisa wild-card inline menggunakan teknik berikut (yang merupakan cara di mana solusi @ Andomar disimpan dalam .csproj)

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

Masukkan:

    <Visible>false</Visible>

Jika Anda ingin menyembunyikan file dan / atau mencegah wild-card termasuk diperluas jika Anda menambah atau menghapus item dari folder 'item virtual yang ada' seperti di MySisterProjectatas.


Bagus Ini terlihat seperti solusi yang baik dan ringan, jika Anda akan memaafkan permainan kata-kata.
CAD berbicara

@Cad Bloke: Ini tentu saja bekerja dengan baik (seperti halnya permainan kata-kata Anda :), tetapi ada banyak yang bisa dikatakan untuk melakukan yang terbaik untuk menghindari tautan di tempat pertama
Ruben Bartelink

2
@CAD Bloke: Ya, itu menyenangkan. Hanya untuk kejelasan, saya akan mengatakan yang berikut secara eksplisit jika itu membantu seseorang ... Anda dapat membongkar / memuat ulang proyek untuk mendapatkannya untuk mengambil perubahan. (Alt-P, L dua kali). Masalah VS2010 adalah bahwa file .targets dll. Disunting ke dalam file .csproj di- <Importcache sampai Anda memuat ulang solusi seperti yang Anda katakan.
Ruben Bartelink

3
Inilah versi terbaru dari tema wildcard saya ... <Kompilasi Sertakan = ".._ Src * *. " Kecualikan = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * .; .._ Src \ obj * * .; .._ Src ***. Csproj; .._ Src ***. Pengguna; .._ Src ***. Vstemplate "> <Link> Src \% (RecursiveDir)% (Nama File)% (Ekstensi) < / Tautan> </Compile>
CAD bloke

1
@ ChrisK Berikut ini beberapa klarifikasi lagi pada suntingan saya di file csproj ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . Saya hanya mengeditnya di Notepad ++. Ketika saya menyimpannya VS melihat itu telah berubah dan meminta memuat ulang. Ada pengaturan di VS untuk mengontrol perilaku ini.
CAD berpasangan pada

18

Anda cukup membuat proyek Perpustakaan Kelas terpisah untuk berisi kode umum. Itu tidak perlu menjadi bagian dari solusi apa pun yang menggunakannya. Referensi perpustakaan kelas dari proyek apa pun yang membutuhkannya.

Satu-satunya trik sama sekali adalah bahwa Anda harus menggunakan referensi file untuk referensi proyek, karena itu tidak akan menjadi bagian dari solusi yang merujuknya. Ini berarti bahwa rakitan keluaran aktual harus ditempatkan di lokasi yang dapat diakses oleh siapa pun yang membangun proyek yang merujuknya. Ini bisa dilakukan dengan menempatkan majelis pada share, misalnya.


Saya kira jika saya membuat acara pembangunan dan menerbitkan dll ke dalam folder _lib sumber yang dikontrol dalam proyek referensi, kemudian periksa bahwa DLL itu akan bekerja .. tampaknya agak
berantakan

1
Jika Anda ingin sumber kontrol setiap build, maka Anda dapat memiliki target build memeriksa dll perpustakaan, salin dari output membangun ke folder perpustakaan, kemudian periksa di dll.
John Saunders

8

Anda dapat memasukkan proyek yang sama dalam lebih dari satu solusi, tetapi Anda dijamin akan mengalami masalah di masa mendatang (jalur relatif dapat menjadi tidak valid saat Anda memindahkan direktori misalnya)

Setelah bertahun-tahun berjuang dengan ini, saya akhirnya datang dengan solusi yang bisa diterapkan, tetapi mengharuskan Anda untuk menggunakan Subversion untuk kontrol sumber (yang bukan hal yang buruk)

Pada tingkat direktori solusi Anda, tambahkan svn: eksternal menunjuk ke proyek yang ingin Anda sertakan dalam solusi Anda. Subversion akan menarik proyek dari repositori dan menyimpannya dalam subfolder dari file solusi Anda. File solusi Anda cukup menggunakan jalur relatif untuk merujuk ke proyek Anda.

Jika saya menemukan lebih banyak waktu, saya akan menjelaskan ini secara rinci.


Dalam mendefinisikan proyek Anda, pastikan untuk hanya menggunakan jalur relatif ... Itu seharusnya, terutama untuk yang dapat digunakan kembali, menyelesaikan lebih dari masalah kecil.
xtofl

5
Hanya untuk referensi, svn:externalstautan keras ke repositori. Saat Anda memindahkan repositori, tautan eksternal masih menunjuk ke repositori lama.
Andomar

Untuk git Anda bisa menggunakan SubTree SVN: ekivalen ekuivalen dalam GIT?
Michael Freidgeim

8

Ekstrak kode umum ke proyek perpustakaan kelas dan tambahkan proyek perpustakaan kelas itu ke solusi Anda. Kemudian Anda bisa menambahkan referensi ke kode umum dari proyek lain dengan menambahkan referensi proyek ke perpustakaan kelas itu. Keuntungan memiliki referensi proyek sebagai lawan dari referensi biner / rakitan adalah bahwa jika Anda mengubah konfigurasi bangunan Anda menjadi debug, rilis, custom, dll, proyek perpustakaan kelas umum akan dibangun berdasarkan konfigurasi itu juga.


5

Merupakan ide bagus untuk membuat perpustakaan kelas dll yang berisi semua fungsi umum. Setiap solusi dapat mereferensikan dll ini secara mandiri terlepas dari solusi lain.

Infact, ini adalah bagaimana sumber kami diatur dalam pekerjaan saya (dan saya percaya di banyak tempat lain).

Omong-omong, Solution tidak dapat secara eksplisit bergantung pada solusi lain.


1
Saya percaya ini adalah salah satu poin terbesar dari pertanyaan yang banyak orang tidak dapatkan.
Del Lee

5

Dua langkah utama yang terlibat adalah

1- Membuat C ++ dll

Di studio visual

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.

Kode File Header

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

File Cpp

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

#include "first_dll.h"

namespace first_dll
{

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

 }

Periksa ini

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

opsi ini harus menjadi Dynamic Library (.dll) dan membangun solusi / proyek sekarang.

File first_dll.dll dibuat di folder Debug

2- Menghubungkannya dalam proyek C #

Buka proyek C #

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

Tambahkan baris ini di atas dalam proyek C #

Using first_dll; 

Sekarang fungsi dari dll dapat diakses menggunakan pernyataan di bawah ini di beberapa fungsi

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

Saya membuat dll dalam proyek c ++ di VS2010 dan menggunakannya dalam VS2013 C # project.It bekerja dengan baik.



4

Jika Anda mencoba untuk membagikan kode antara dua jenis proyek yang berbeda (Yaitu: proyek desktop dan proyek seluler), Anda dapat melihat ke folder solusi bersama . Saya harus melakukan itu untuk proyek saya saat ini karena proyek seluler dan desktop keduanya memerlukan kelas yang identik yang hanya dalam 1 file. Jika Anda memilih rute ini, salah satu proyek yang memiliki file yang ditautkan dapat membuat perubahan padanya dan semua proyek akan dibangun kembali terhadap perubahan itu.


Bagaimana cara kerjanya, Stevoni? Bisakah Anda memberikan informasi lebih lanjut?
Steve Dunn

@SteveDunn Saya memposting caranya di blog saya yang sangat jarang diperbarui (sekolah dan pekerjaan bodoh menghalangi hal yang menyenangkan dalam hidup). Itu dapat ditemukan di sini
Stevoni

4

Ada kasus yang sangat baik untuk menggunakan "menambahkan tautan file yang ada" ketika menggunakan kembali kode di seluruh proyek, dan saat itulah Anda perlu referensi dan mendukung versi berbeda dari pustaka dependen.

Membuat banyak majelis dengan referensi ke majelis eksternal yang berbeda tidak mudah dilakukan tanpa menduplikasi kode Anda, atau menggunakan trik dengan kontrol kode sumber.

Saya percaya bahwa paling mudah untuk mempertahankan satu proyek untuk pengembangan dan pengujian unit, kemudian untuk membuat proyek 'membangun' menggunakan tautan file yang ada ketika Anda perlu membuat rakitan yang merujuk versi berbeda dari rakitan eksternal tersebut.


2

Salah satu cara sederhana untuk memasukkan file kelas dari satu proyek dalam proyek lain adalah dengan Menambahkan proyek dalam solusi yang ada dan kemudian Menambahkan referensi DLL dari proyek baru di proyek yang ada. Akhirnya, Anda dapat menggunakan metode kelas tambahan dengan melakukan decalring menggunakan arahan di bagian atas kelas apa pun.


2

Pada VisualStudio 2015, jika Anda menyimpan semua kode Anda dalam satu solusi, Anda dapat berbagi kode dengan menambahkan proyek bersama . Kemudian tambahkan referensi ke proyek bersama ini untuk setiap proyek yang Anda ingin gunakan kode, serta arahan penggunaan yang tepat.


2

Sekarang Anda dapat menggunakan Proyek Bersama

Proyek Bersama adalah cara yang bagus untuk berbagi kode umum di beberapa aplikasi. Kami telah berpengalaman dengan jenis Proyek Bersama di Visual Studio 2013 sebagai bagian dari Pengembangan Aplikasi Universal Windows 8.1, Tetapi dengan Visual Studio 2015, itu adalah Template Proyek Baru Standalone; dan kita dapat menggunakannya dengan jenis aplikasi lain seperti Konsol, Desktop, Telepon, Toko Aplikasi dll. Jenis proyek ini sangat membantu ketika kita ingin berbagi kode umum, logika serta komponen di beberapa aplikasi dengan dalam satu platform . Ini juga memungkinkan mengakses API khusus platform, aset, dll.

masukkan deskripsi gambar di sini

untuk info lebih lanjut, periksa ini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.