Visual Studio'daki kodlar projeler / çözümler arasında nasıl paylaşılır?


229

Bazı ortak kodu olan iki çözüm var, bu yüzden çıkarmak ve aralarında paylaşmak istiyorum. Ayrıca, bu kütüphaneyi bağımsız olarak yayınlayabilmek istiyorum çünkü başkaları için yararlı olabilir.

  • Visual Studio 2008 ile yapmanın en iyi yolu nedir?
  • Bir proje birden fazla çözümde mevcut mu?
  • Ayrı kod parçası için ayrı bir çözümüm var mı?
  • Bir çözüm diğerine bağlı olabilir mi?

15
2014. Nuget cevap.
Ravi

1
@Ravi Ofisimde geliştirilen bir Visual Studio Web Uygulamasını modüle etmek istedim, ancak Visual Studio Web Uygulamasını farklı Web Uygulamalarına modülerleştirmeyi düşünmeye çalıştığımda, bileşenler arasındaki dairesel bağımlılık yanlış geliyor. çok fazla bağımlılık olduğundan, planlanan her Web Uygulaması için POCO projesini modüle edemez. Modülerleştirmeye yardımcı olması için Nuget'i kullanabilmemin bir yolu var mı?
CS Lewis

Yanıtlar:


70

Bir projeye birden fazla çözümle başvurulabilir.

Kitaplığınızı veya çekirdek kodunuzu tek bir projeye yerleştirin, ardından her iki çözümde de bu projeye başvurun.


150
Tamam ama nasıl? Bazı talimatlar?
cja

2
Bu (eski) cevap, birden fazla montajla sonuçlandığı için kendi başına tamamlanmamıştır: ancak ILMerge ile birleştiğinde - özellikle içselleştir seçeneği ile - çok güçlü bir çözüm haline gelir.
user2246674

2
@ user2246674: birden fazla montaj nedeniyle neden eksik? OP tek bir meclis hakkında hiçbir şey söylemedi.
John Saunders

1
@Jfly: Herkese görünür olmayan şeyleri yeniden adlandırmak dış kodu etkilemez. Şeyleri yeniden adlandırma olan ortak kod ve ortak kodun kendisini kullanarak tüm projeler tek bir çözümle neresinde yalnızca yapılmalıdır herkes tarafından görülebilir. Tüm bu projeleri içeren ve yalnızca bu amaçla kullanılan "ana" çözümleri el ile oluşturabilirsiniz.
John Saunders

1
Başka bir örnekle ne demek istediğinize bağlı. Muhtemelen daha fazla ayrıntıyla yeni bir soru başlatmak için iyi olur.
ilivewithian

248

Bir kod dosyasını iki proje arasında "bağlayabilirsiniz". Projenizi sağ tıklayın, Add-> öğesini seçin Existing itemve ardından Adddüğmenin yanındaki aşağı oku tıklayın:

Screengrab

Deneyimlerime göre bağlantı bir kütüphane oluşturmaktan daha kolaydır. Bağlantılı kod, tek bir sürümü olan tek bir yürütülebilir dosya ile sonuçlanır.


9
Tatlı - aradığım cevap bu. Bir DLL koleksiyonu istemedim. şerefe
CAD bloke

63
Neden böyle yapasın ki? Bu yüzden kütüphanelerimiz, kapsüllememiz var. Hiçbir iş anlayışı veya bunu neden yapacağınız konusunda mantıklı bir anlam görmüyorum.
Ryan Ternier

16
Ayrıca bağlantılarınız aynı kaynak kontrolü altında olmayabilir. Bu çok tehlikeli bir öneri.
Kugel

11
Bu çözümün faydalı olduğu durumlar vardır. Örnek olarak, SharePoint'e ayrı bir DLL dağıtmanın kolay olmadığı InfoPath 2007'de geliştiriyorum. InfoPath formları arasında ortak işlevselliği paylaşmak için bağlantılı sınıf dosyası yaklaşımı çok yararlıdır. Bireysel form projelerinin bir düzey üzerine yerleştirilir ve her şey kök düzeyinde kaynak kontrol edilir.
Oliver Gray

6
Yararlılığın başka bir örneği olarak, birbirinizle iletişim kurmanız gereken iki uygulama geliştirdiğinizi söyleyin. Biri 64 bit ve diğeri 32, bu yüzden her proje formu referans için aynı kod inşa ayrı dlls istemiyorum gerekmez. Bu şekilde .h dosyası kullanmanın c işlevselliğini taklit edebilirsiniz.
user912447

33

File > Add > Existing Project...mevcut çözümünüze projeler eklemenize izin verir. Yukarıdaki yazıların hiçbiri bunu işaret etmediğinden bunu eklemeniz yeterli. Bu, aynı projeyi birden çok çözüme dahil etmenizi sağlar.


1
Bu işe yarıyor; olumsuz yönde ise her iki projeyi tek bir meclise kurmaz.
Ian Boyd

24

Sen can birden fazla çözümde bir proje bulunmaktadır. Bir projenin hangi çözümün bir parçası olduğunu düşünmüyorum. Bununla birlikte, başka bir alternatif ilk çözümün iyi bilinen bir yere inşa edilmesini sağlamak ve derlenmiş ikili dosyalara başvurmaktır. Bu, sürüm ya da hata ayıklama yapılandırmaları oluşturmanıza bağlı olarak farklı sürümlere başvurmak istiyorsanız, biraz iş yapmanız gerekecek dezavantaja sahiptir.

Bir çözümü aslında diğerine bağımlı hale getirebileceğinize inanmıyorum, ancak otomatikleştirilmiş yapılarınızı özel komut dosyaları aracılığıyla uygun bir sırayla gerçekleştirebilirsiniz. Temel olarak ortak kitaplığınıza NUnit vb.Gibi başka bir üçüncü taraf bağımlılığı gibi davranın.


Proje, nuget paketlerinin nerede depolandığını takip eder ve bu, yapım süresinde baş ağrılarına yol açabilecek solüsyon açılmasıyla değiştirilebilir, bu da tercih edilen bir çözümdür.
Shane Courtrille

23

Aşağıdaki tekniği (@ Andomar'ın çözümünün .csproj'a kaydedilme şekli) kullanarak satır içi joker karakter ekleyebilirsiniz.

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

Koy:

    <Visible>false</Visible>

Dosyaları gizlemek ve / veya MySisterProjectyukarıdaki gibi bir 'sanal var olan öğe' klasörüne bir öğe ekler veya kaldırırsanız joker kartın genişletilmesini önlemek istiyorsanız .


Güzel bir. Pun'ı affederseniz, bu hoş ve hafif bir çözüm gibi görünüyor.
CAD bloke

@Cad bloke: Kesinlikle işe yarıyor (cinayetiniz gibi :), ancak ilk etapta bağlantılardan kaçınmak için elinizden gelenin en iyisini yapmak için
söylenecek

2
@CAD Bloke: Evet, bu eğlenceli. Sadece netlik için, birisine yardımcı olması durumunda aşağıdakileri açıkça söyleyeceğim ... Bir projeyi değişiklikleri almak için kaldırabilir / yeniden yükleyebilirsiniz. (Alt-P, L iki kez). VS2010 sorunu .tarpro dosyaları vb <Import.csproj dosyaları içine ed söylediğiniz çözümleri yeniden yükleme kadar önbelleğe alınan olmasıdır.
Ruben Bartelink

3
İşte joker temanın en son sürümü ... <Derleme Dahil et = ".._ Src * *. " Hariç tut = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * .; .._ Src \ obj * * .; .._ Src ***. Csproj; .._ Src ***. Kullanıcı; .._ Src ***. Vstemplate "> <Link> Src \% (RecursiveDir)% (Dosyaadı)% (Uzantı) < / Link> </Compile>
CAD bloke

1
@ChrisK İşte csproj dosyasındaki düzenlemelerim hakkında daha fazla açıklama ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . Sadece Notepad ++ ile düzenlerim. Ne zaman kaydetmek VS değişti görür ve bir yeniden yükleme ister. VS'de bu davranışı kontrol etmek için ayarlar vardır.
CAD bloke

18

Ortak kodu içermek için ayrı bir Sınıf Kütüphanesi projesi oluşturmanız yeterlidir. Bunu kullanan herhangi bir çözümün parçası olması gerekmez. İhtiyaç duyulan herhangi bir projeden sınıf kitaplığına başvurun.

Tek hile, projeye referans vermek için bir dosya referansı kullanmanız gerekeceğidir, çünkü projeye başvuran çözümlerin bir parçası olmayacaktır. Bu, gerçek çıktı düzeneğinin kendisine referans veren bir proje inşa eden herkesin erişebileceği bir konuma yerleştirilmesi gerektiği anlamına gelir. Bu, örneğin montajı bir paylaşıma yerleştirerek yapılabilir.


Ben bir yapı olayı oluşturmak ve referans projede kaynak kontrollü _lib klasörüne dll yayınlamak sanırım, o zaman işe yarayacak DLL kontrol edin .. tür hacky tho görünüyor ..
hanzolo

1
Her yapıyı kontrol etmek istiyorsanız, kütüphane dll'lerini kontrol edin, derleme çıktılarından kütüphane klasörlerine kopyalayın ve daha sonra dll'leri kontrol edin.
John Saunders

8

Aynı projeyi birden fazla çözüme dahil edebilirsiniz, ancak yolda bir süre sorunla karşılaşmanız garanti edilir (örneğin dizinleri hareket ettirdiğinizde göreli yollar geçersiz olabilir)

Yıllarca bununla mücadele ettikten sonra, nihayet uygulanabilir bir çözüm buldum, ancak Subversion'u kaynak kontrolü için kullanmanızı gerektirir (bu kötü bir şey değildir)

Çözümünüzün dizin düzeyinde, çözümünüze dahil etmek istediğiniz projelere işaret eden bir svn: externals özelliği ekleyin . Subversion, projeyi depodan alır ve çözüm dosyanızın bir alt klasöründe saklar. Çözüm dosyanız projenize başvurmak için göreli yolları kullanabilir.

Biraz daha zaman bulursam, bunu ayrıntılı olarak açıklayacağım.


Projelerinizi tanımlarken, yalnızca göreli yolları kullandığınızdan emin olun ... Bu, özellikle yeniden kullanılabilir bir yol için küçük bir problemden daha fazlasını çözmelidir.
xtofl

5
Sadece referans için, svn:externalsbir havuza sabit bağlantılar. Depoyu taşıdığınızda, dış bağlantılar hala eski depoya işaret eder.
Andomar


8

Ortak kodu bir sınıf kitaplığı projesine çıkarın ve bu sınıf kitaplığı projesini çözümlerinize ekleyin. Ardından, bu sınıf kitaplığına bir proje başvurusu ekleyerek diğer projelerin ortak koduna bir başvuru ekleyebilirsiniz. İkili / derleme başvurusunun tersine bir proje başvurusuna sahip olmanın avantajı, derleme yapılandırmanızı hata ayıklama, serbest bırakma, özel vb. Olarak değiştirirseniz, ortak sınıf kitaplığı projesinin de bu yapılandırmaya dayalı olarak oluşturulmasıdır.


5

Tüm ortak işlevleri içeren bir dll sınıf kitaplığı oluşturmak iyi bir fikirdir. Her çözüm, diğer çözümlerden bağımsız olarak bu dll'ye bağımsız olarak başvurabilir.

Gerçekte, çalışmalarımızda kaynaklarımız bu şekilde organize ediliyor (ve diğer birçok yere inanıyorum).

Bu arada, Çözüm açıkça başka bir çözüme bağlı olamaz.


1
Bunun bir ton insanın açıkça alamadığı sorunun en büyük noktalarından biri olduğuna inanıyorum.
Del Lee

5

İlgili iki ana adım:

1- C ++ dll oluşturma

Görsel stüdyoda

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.

Başlık Dosya kodu

// 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 Dosyası

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

#include "first_dll.h"

namespace first_dll
{

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

 }

Şuna göz at

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

bu seçenek Dinamik Kitaplık (.dll) olmalı ve çözümü / projeyi şimdi oluşturmalıdır.

first_dll.dll dosyası Debug klasöründe oluşturulur

2- C # projesine bağlama

Açık C # projesi

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

Bu satırı C # projesinde en üste ekleyin

Using first_dll; 

Şimdi dll işlevinden bazı işlevlerde aşağıdaki deyim kullanılarak erişilebilir

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

VS2010 c ++ projesinde dll yarattı ve VS2013 C # projesinde kullandım.İyi çalışıyor.



4

Kodu iki farklı proje türü (yani: masaüstü projesi ve bir mobil proje) arasında paylaşmaya çalışıyorsanız, paylaşılan çözümler klasörüne bakabilirsiniz . Mobil ve masaüstü projelerinin her ikisi de sadece 1 dosyadaki aynı sınıfları gerektirdiğinden, şu anki projem için bunu yapmalıyım. Bu rotaya giderseniz, dosyaya bağlı projelerden herhangi biri bu dosyada değişiklik yapabilir ve tüm projeler bu değişikliklere karşı yeniden oluşturulacaktır.


Stevoni nasıl çalışır? Daha fazla bilgi verebilir misiniz?
Steve Dunn

@SteveDunn Çok nadiren güncellenen bloguma (aptal okul ve iş hayatındaki eğlenceli şeylerin önüne geçiyor) nasıl yapılır. Bu bulunabilir burada
Stevoni

4

Projeler arasında kodu yeniden kullanırken "mevcut dosya bağlantılarını ekleme" yi kullanmak için çok iyi bir durum vardır ve bu, bağımlı kitaplıkların farklı sürümlerine başvurmanız ve desteklemeniz gerektiğidir.

Farklı harici montajlara referanslarla birden fazla montaj yapmak, kodunuzu çoğaltmadan veya kaynak kodu kontrolü ile püf noktaları kullanmadan yapmak kolay değildir.

Geliştirme ve birim testi için bir projeyi sürdürmenin, daha sonra bu harici derlemelerin farklı sürümlerini referans alan derlemeler oluşturmanız gerektiğinde mevcut dosya bağlantılarını kullanarak 'derleme' projeleri oluşturmanın en kolay yol olduğuna inanıyorum.


2

Bir projenin sınıf dosyasını başka bir projeye dahil etmenin daha basit bir yolu, projeyi mevcut çözümde ekleme ve ardından yeni projenin DLL başvurusunu mevcut projeye ekleme. Son olarak, herhangi bir sınıfın en üstündeki yönerge kullanarak çıkartma yaparak eklenen sınıfın yöntemlerini kullanabilirsiniz.


2

VisualStudio 2015'ten itibaren, tüm kodunuzu tek bir çözümde tutarsanız, paylaşılan bir proje ekleyerek kodu paylaşabilirsiniz . Ardından, kodu kullanmak istediğiniz her proje için uygun paylaşılan yönergelerin yanı sıra bu paylaşılan projeye bir başvuru ekleyin.


2

Artık Paylaşılan Projeyi kullanabilirsiniz

Paylaşılan Proje, ortak kodu birden çok uygulamada paylaşmanın harika bir yoludur Windows 8.1 Evrensel Uygulama Geliştirmesinin bir parçası olarak Visual Studio 2013'te Paylaşılan Proje türüyle zaten deneyimledik, ancak Visual Studio 2015 ile Bağımsız Yeni Proje Şablonu; Konsol, Masaüstü, Telefon, Mağaza Uygulaması vb.Gibi diğer uygulama türleri ile birlikte kullanabiliriz. Bu tür proje, ortak bir kodu, mantığı ve bileşenleri birden çok uygulamada tek bir platformda paylaşmak istediğimizde son derece yararlıdır. . Bu aynı zamanda platforma özgü API'lerin, varlıkların vb.

resim açıklamasını buraya girin

daha fazla bilgi için bunu kontrol et

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.