Wie können Sie Code zwischen Projekten / Lösungen in Visual Studio freigeben?

229

Ich habe zwei Lösungen, die einen gemeinsamen Code haben, daher möchte ich ihn extrahieren und zwischen ihnen teilen. Darüber hinaus möchte ich in der Lage sein, diese Bibliothek unabhängig freizugeben, da sie für andere nützlich sein könnte.

  • Wie geht das am besten mit Visual Studio 2008?
  • Ist ein Projekt in mehr als einer Lösung vorhanden?
  • Habe ich eine separate Lösung für den separaten Code?
  • Kann eine Lösung von einer anderen abhängen?
pupeno
quelle
15
Sein 2014. Nuget ist die Antwort.
Ravi
1
@ Ravi Ich wollte eine in meinem Büro entwickelte Visual Studio-Webanwendung modularisieren. Wenn ich jedoch daran denke, die Visual Studio-Webanwendung in verschiedene Webanwendungen zu modularisieren, tritt die zirkuläre Abhängigkeit zwischen Komponenten auf, die falsch ist. Zum Beispiel I. Das POCO-Projekt kann nicht für jede geplante Webanwendung modularisiert werden, da zu viele Abhängigkeiten bestehen. Gibt es eine Möglichkeit, mit Nuget beim Modularisieren zu helfen?
CS Lewis

Antworten:

70

Ein Projekt kann von mehreren Lösungen referenziert werden.

Fügen Sie Ihre Bibliothek oder Ihren Kerncode in ein Projekt ein und verweisen Sie dann in beiden Lösungen auf dieses Projekt.

ilivewithian
quelle
149
OK aber wie? Einige Anweisungen?
Cja
2
Diese (alte) Antwort ist an sich unvollständig, da sie zu mehreren Assemblys führt. In Verbindung mit ILMerge - insbesondere mit der Option internalisieren - wird sie jedoch zu einer sehr leistungsstarken Lösung.
user2246674
2
@ user2246674: Warum ist es wegen mehrerer Assemblys unvollständig? Das OP sagte nichts über eine einzelne Versammlung.
John Saunders
1
@Jfly: Das Umbenennen von Dingen, die nicht öffentlich sichtbar sind, wirkt sich nicht auf externen Code aus. Umbenennen Dinge , die sind nur öffentlich sichtbar getan werden sollte , wo alle Projekte den gemeinsamen Code verwenden, und den gemeinsamen Code selbst, in einer einzigen Lösung. Sie können manuell "Master" -Lösungen erstellen, die alle diese Projekte enthalten und nur für diesen Zweck verwendet werden.
John Saunders
1
Es hängt davon ab, was Sie mit einer anderen Instanz meinen. Sie würden wahrscheinlich gut daran tun, eine neue Frage mit einigen weiteren Details zu beginnen.
ilivewithian
248

Sie können eine Codedatei zwischen zwei Projekten "verknüpfen". Klicken Sie mit der rechten Maustaste auf Ihr Projekt, wählen Sie Add-> Existing itemund klicken Sie dann auf den Abwärtspfeil neben der AddSchaltfläche:

Screengrab

Nach meiner Erfahrung ist das Verknüpfen einfacher als das Erstellen einer Bibliothek. Verknüpfter Code führt zu einer einzelnen ausführbaren Datei mit einer einzelnen Version.

Andomar
quelle
9
Süß - das ist die Antwort, nach der ich gesucht habe. Ich wollte keine Sammlung von DLLs. Prost
CAD Kerl
63
Warum würdest du es so machen? Deshalb haben wir Bibliotheken, Kapselung. Ich sehe keinen geschäftlichen oder logischen Sinn dafür, warum Sie dies tun würden.
Ryan Ternier
16
Darüber hinaus unterliegen Ihre Links möglicherweise nicht derselben Quellcodeverwaltung. Dies ist ein sehr gefährlicher Vorschlag.
Kugel
11
Es gibt Situationen, in denen diese Lösung nützlich ist. Als Beispiel entwickle ich in InfoPath 2007, wo es nicht einfach ist, eine separate DLL in SharePoint bereitzustellen. Um gemeinsame Funktionen zwischen InfoPath-Formularen zu nutzen, ist der Ansatz der verknüpften Klassendatei sehr nützlich. Es befindet sich eine Ebene über den einzelnen Formularprojekten und alles wird auf der Stammebene quellengesteuert.
Oliver Gray
6
Als weiteres Beispiel für die Nützlichkeit sagen Sie, dass Sie zwei Anwendungen entwickeln, die miteinander kommunizieren müssen. Eine ist 64-Bit und die andere 32-Bit, sodass Sie nicht unbedingt separate DLLs aus demselben Code als Referenz für jedes Projekt benötigen. Auf diese Weise können Sie die c-Funktionalität der Verwendung einer .h-Datei nachahmen.
user912447
33

File > Add > Existing Project...Mit dieser Option können Sie Ihrer aktuellen Lösung Projekte hinzufügen. Fügen Sie dies einfach hinzu, da keiner der oben genannten Beiträge darauf hinweist. Auf diese Weise können Sie dasselbe Projekt in mehrere Lösungen aufnehmen.

Aseem Kishore
quelle
1
Das funktioniert; Auf der anderen Seite werden nicht beide Projekte in einer Baugruppe zusammengefasst.
Ian Boyd
24

Sie können ein Projekt in mehrere Lösungen aufnehmen. Ich glaube nicht, dass ein Projekt ein Konzept dafür hat, zu welcher Lösung es gehört. Eine andere Alternative besteht jedoch darin, die erste Lösung an einem bekannten Ort zu erstellen und auf die kompilierten Binärdateien zu verweisen. Dies hat den Nachteil, dass Sie ein wenig arbeiten müssen, wenn Sie auf verschiedene Versionen verweisen möchten, je nachdem, ob Sie Release- oder Debug-Konfigurationen einbauen.

Ich glaube nicht, dass Sie eine Lösung tatsächlich von einer anderen abhängig machen können, aber Sie können Ihre automatisierten Builds in einer geeigneten Reihenfolge über benutzerdefinierte Skripte ausführen. Behandeln Sie Ihre gemeinsame Bibliothek grundsätzlich so, als wäre es eine andere Abhängigkeit von Drittanbietern wie NUnit usw.

Jon Skeet
quelle
Das Projekt hat eine Spur, in der Nuget-Pakete gespeichert sind, und dies kann durch Öffnen der Lösung geändert werden, was zu Kopfschmerzen beim Erstellen führen kann. Dies ist daher eine bevorzugte Lösung.
Shane Courtrille
23

Sie können Platzhalter mit der folgenden Technik inline platzieren (auf diese Weise wird die Lösung von @ Andomar in der .csproj gespeichert).

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

Einstellen:

    <Visible>false</Visible>

Wenn Sie die Dateien ausblenden und / oder verhindern möchten, dass der Platzhalter erweitert wird, wenn Sie ein Element wie MySisterProjectoben beschrieben zu einem Ordner "Virtuell vorhandenes Element" hinzufügen oder daraus entfernen .

Ruben Bartelink
quelle
Schön. Dies sieht nach einer schönen, leichten Lösung aus, wenn Sie das Wortspiel verzeihen.
CAD Kerl
@ Cad Kerl: Es funktioniert sicher in Ordnung (wie auch Ihr Wortspiel :), aber es gibt viel zu sagen, wenn Sie Ihr Möglichstes tun, um Links zu vermeiden
Ruben Bartelink
2
@ CAD Bloke: Ja, das macht Spaß. Nur zur Verdeutlichung sage ich Folgendes explizit, falls es jemandem hilft ... Sie können ein Projekt entladen / neu laden, damit es Änderungen aufnimmt. (Alt-P, L zweimal). Das VS2010-Problem besteht darin, dass .targets-Dateien usw., die <Importin .csproj-Dateien gespeichert sind, zwischengespeichert werden, bis Sie die Lösungen wie gesagt neu laden.
Ruben Bartelink
3
Hier ist meine neueste Version des Platzhalter-Themas ... <Compile Include = ".._ Src * *. " Exclude = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * . ; .._ Src \ obj * * . ; .._ Src ***. Csproj; .._ Src ***. Benutzer; .._ Src ***. Vstemplate "> <Link> Src \% (RecursiveDir)% (Dateiname)% (Erweiterung) < / Link> </ Compile>
CAD-Typ
1
@ChrisK Hier finden Sie weitere Erläuterungen zu meinen Änderungen in der csproj-Datei ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . Ich bearbeite es einfach in Notepad ++. Wenn ich es speichere, sieht VS, dass es sich geändert hat und bittet um ein erneutes Laden. In VS gibt es Einstellungen, um dieses Verhalten zu steuern.
CAD Kerl
18

Sie würden einfach ein separates Klassenbibliotheksprojekt erstellen, das den allgemeinen Code enthält. Es muss nicht Teil einer Lösung sein, die es verwendet. Verweisen Sie auf die Klassenbibliothek aus jedem Projekt, das sie benötigt.

Der einzige Trick besteht darin, dass Sie einen Dateiverweis verwenden müssen, um auf das Projekt zu verweisen, da dieser nicht Teil der Lösungen ist, die darauf verweisen. Dies bedeutet, dass die eigentliche Ausgabebaugruppe an einem Ort platziert werden muss, auf den jeder zugreifen kann, der ein Projekt erstellt, das darauf verweist. Dies kann beispielsweise durch Platzieren der Baugruppe auf einer Freigabe erfolgen.

John Saunders
quelle
Ich denke, wenn ich ein Build-Ereignis erstelle und die DLL im quellgesteuerten Ordner _lib im Referenzierungsprojekt veröffentliche, dann checke ein, dass die DLL funktionieren würde. Scheint irgendwie hackig zu sein.
hanzolo
1
Wenn Sie die Quellcodeverwaltung für jeden Build steuern möchten, können Sie die Build-DLLs von einem Build-Ziel auschecken lassen, von den Build-Ausgaben in die Bibliotheksordner kopieren und dann die DLLs einchecken.
John Saunders
8

Sie können dasselbe Projekt in mehr als eine Lösung aufnehmen, aber Sie werden garantiert irgendwann auf Probleme stoßen (relative Pfade können ungültig werden, wenn Sie beispielsweise Verzeichnisse verschieben).

Nachdem ich jahrelang damit zu kämpfen hatte, fand ich endlich eine praktikable Lösung, aber dafür müssen Sie Subversion für die Quellcodeverwaltung verwenden (was keine schlechte Sache ist).

Fügen Sie auf der Verzeichnisebene Ihrer Lösung eine svn: externals- Eigenschaft hinzu, die auf die Projekte verweist, die Sie in Ihre Lösung aufnehmen möchten. Subversion zieht das Projekt aus dem Repository und speichert es in einem Unterordner Ihrer Lösungsdatei. Ihre Lösungsdatei kann einfach relative Pfade verwenden, um auf Ihr Projekt zu verweisen.

Wenn ich mehr Zeit finde, erkläre ich dies ausführlich.

Philippe Leybaert
quelle
Stellen Sie beim Definieren Ihrer Projekte sicher, dass nur relative Pfade verwendet werden. Dies sollte insbesondere bei wiederverwendbaren Pfaden mehr als ein winziges Problem lösen.
xtofl
5
Nur als Referenz, svn:externalsharte Links zu einem Repository. Wenn Sie das Repository verschieben, verweisen die externen Links weiterhin auf das alte Repository.
Andomar
Für Git können Sie SubTree SVN verwenden: Externes Äquivalent in GIT?
Michael Freidgeim
8

Extrahieren Sie den allgemeinen Code in ein Klassenbibliotheksprojekt und fügen Sie dieses Klassenbibliotheksprojekt Ihren Lösungen hinzu. Anschließend können Sie einen Verweis auf den allgemeinen Code aus anderen Projekten hinzufügen, indem Sie einen Projektverweis auf diese Klassenbibliothek hinzufügen. Der Vorteil einer Projektreferenz im Gegensatz zu einer Binär- / Assemblyreferenz besteht darin, dass das Common Class Library-Projekt auch basierend auf dieser Konfiguration erstellt wird, wenn Sie Ihre Build-Konfiguration in Debug, Release, Custom usw. ändern.

Mehmet Aras
quelle
5

Es ist eine gute Idee, eine DLL-Klassenbibliothek zu erstellen, die alle gängigen Funktionen enthält. Jede Lösung kann unabhängig von anderen Lösungen unabhängig auf diese DLL verweisen.

Tatsächlich sind unsere Quellen in meiner Arbeit so organisiert (und ich glaube an viele andere Orte).

Die Lösung kann übrigens nicht explizit von einer anderen Lösung abhängen.

user88637
quelle
Ich glaube, dies ist einer der größten Punkte der Frage, die eine Menge Leute offensichtlich nicht bekommen.
Del Lee
5

Zwei Hauptschritte sind:

1- Erstellen einer C ++ - DLL

Im visuellen Studio

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.

Header-Dateicode

// 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-Datei

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

#include "first_dll.h"

namespace first_dll
{

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

 }

Überprüfen Sie dies

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

Diese Option sollte Dynamic Library (.dll) sein und die Lösung / das Projekt jetzt erstellen.

Die Datei first_dll.dll wird im Debug-Ordner erstellt

2- Verknüpfen im C # -Projekt

Öffnen Sie das C # -Projekt

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

Fügen Sie diese Zeile oben im C # -Projekt hinzu

Using first_dll; 

Jetzt kann auf die Funktion von DLL mit der folgenden Anweisung in einigen Funktionen zugegriffen werden

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

Ich habe DLL in C ++ Projekt in VS2010 erstellt und es in VS2013 C # Projekt verwendet. Es funktioniert gut.

Croko
quelle
5

Sie können einen internen NuGet-Server hosten und die allgemeinen Bibliotheken freigeben, die in anderen Projekten intern und extern freigegeben werden.

Weiter auf dieser Lese

Si Zi
quelle
4

Wenn Sie versuchen, Code für zwei verschiedene Projekttypen freizugeben (z. B. Desktop-Projekt und mobiles Projekt), können Sie in den Ordner für freigegebene Lösungen schauen . Ich muss das für mein aktuelles Projekt tun, da sowohl für mobile als auch für Desktop-Projekte identische Klassen erforderlich sind, die sich nur in einer Datei befinden. Wenn Sie diesen Weg gehen, können alle Projekte, mit denen die Datei verknüpft ist, Änderungen daran vornehmen, und alle Projekte werden anhand dieser Änderungen neu erstellt.

Stevoni
quelle
Wie funktioniert das Stevoni? Könnten Sie weitere Informationen bereitstellen?
Steve Dunn
@SteveDunn Ich habe in meinem sehr selten aktualisierten Blog eine Anleitung veröffentlicht (dumme Schule und Arbeit behindern die lustige Sache im Leben). Es kann hier gefunden werden
Stevoni
4

Es gibt einen sehr guten Fall für die Verwendung des "Hinzufügens vorhandener Dateilinks", wenn Code projektübergreifend wiederverwendet wird. In diesem Fall müssen Sie auf verschiedene Versionen abhängiger Bibliotheken verweisen und diese unterstützen.

Das Erstellen mehrerer Assemblys mit Verweisen auf verschiedene externe Assemblys ist ansonsten nicht einfach, ohne Ihren Code zu duplizieren oder Tricks mit Quellcodeverwaltung zu verwenden.

Ich glaube, dass es am einfachsten ist, ein Projekt für die Entwicklung und den Komponententest zu verwalten und dann Projekte mit vorhandenen Dateilinks zu erstellen, wenn Sie Assemblys erstellen müssen, die auf verschiedene Versionen dieser externen Assemblys verweisen.

Rick Sipin
quelle
2

Eine einfachere Möglichkeit, eine Klassendatei eines Projekts in ein anderes Projekt aufzunehmen, besteht darin, das Projekt in eine vorhandene Lösung einzufügen und anschließend die DLL-Referenz des neuen Projekts in das vorhandene Projekt einzufügen. Schließlich können Sie die Methoden der hinzugefügten Klasse verwenden, indem Sie sie mit der Direktive oben in einer beliebigen Klasse dekalieren.

Amarendra K.
quelle
2

Wenn Sie ab VisualStudio 2015 Ihren gesamten Code in einer Lösung behalten, können Sie Code freigeben, indem Sie ein freigegebenes Projekt hinzufügen . Fügen Sie dann für jedes Projekt, in dem Sie den Code verwenden möchten, einen Verweis auf dieses freigegebene Projekt sowie die richtigen Verwendungsanweisungen hinzu.

wecky
quelle
2

Jetzt können Sie das freigegebene Projekt verwenden

Shared Project ist eine großartige Möglichkeit, gemeinsamen Code für mehrere Anwendungen freizugeben. Wir haben bereits Erfahrungen mit dem Typ Shared Project in Visual Studio 2013 im Rahmen der universellen Windows 8.1-App-Entwicklung gesammelt. Mit Visual Studio 2015 handelt es sich jedoch um eine eigenständige neue Projektvorlage. und wir können es mit anderen Arten von Apps wie Konsole, Desktop, Telefon, Store App usw. verwenden. Diese Art von Projekt ist äußerst hilfreich, wenn wir einen gemeinsamen Code, eine gemeinsame Logik sowie Komponenten für mehrere Anwendungen auf einer einzigen Plattform gemeinsam nutzen möchten . Dies ermöglicht auch den Zugriff auf die plattformspezifischen APIs, Assets usw.

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen finden Sie hier

Hussein Khalil
quelle