2016-06-29 16 views
0

Sorry, wenn dies ein Repost/Duplikat ist, aber ich konnte nichts Relevantes finden. HierWie erhalten Sie die Assemblies für jedes Projekt in einer Lösung ohne Referenzen?

ist, was ich versucht habe:

var assembly = Assembly.GetExecutingAssembly(); 

, die Ihnen die Ausführung der Montage und mit

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

bekommt, die jede Baugruppe einschließlich Ihrer Referenzen erhalten können.

Ich möchte jedoch alle Assemblys der Projekte der Lösung (nicht Pakete/Referenzen).

+2

Was bedeutet "spezifisch für meine Projekte"? Zur Laufzeit gibt es keine Vorstellung von "Ihre Lösung" im Gegensatz zu "Pakete"; Es gibt nur Versammlungen. – SLaks

+0

Sie können das zur Laufzeit nicht bekommen - zur Laufzeit gibt es keinen Unterschied zwischen einer Projektreferenz und einer Assembly-Referenz. Sie müssen sich die Lösungsdefinitionsdatei ('.sln') ansehen und die Ausgaben für jedes Projekt bestimmen. Was ist der Zweck? Warum müssen Sie die beiden unterscheiden? –

+3

Sie können [ein benutzerdefiniertes Attribut auf Ihre eigenen Baugruppen anwenden] (http://stackoverflow.com/a/1936982/382780), um sie zu filtern. Ist es eine Option, dies zu den Projekten in Ihrer Lösung hinzuzufügen? – 31eee384

Antwort

1

Andere haben bereits darauf hingewiesen, dass es zwischen Baugruppen keine Unterscheidung gibt. Sobald Sie die Lösungen erstellt haben, sind alle implementierten Assemblys nur Assemblys, ob Sie nun oder als Referenzen enthalten sind, es ist alles gleich.

Die einzige genaue Lösung ist, die .sln-Datei zu Ihrer Verfügung zu haben. Es ist nur eine XML-Datei mit einem einfachen Schema und es ist einfach, Daten daraus zu ziehen, vorausgesetzt, Sie haben Zugriff darauf.

Eine weitere Option könnte die Anwendung von Heuristiken zur Unterscheidung sein. Sie könnten beispielsweise versuchen, Namensbereiche aus Typen in der ausführenden Assembly zu erstellen. Dies ist der Einstiegspunkt der Anwendung und daher könnten wir argumentieren, dass es Teil der Lösung gewesen sein muss.

Dann können Sie Assemblys überprüfen, die von GetAssemblies() abgerufen wurden, und dann die Namespaces der darin enthaltenen Typen überprüfen. Wenn Sie Überschneidungen zwischen (Teilen) von Namespacepfades zwischen einer Assembly und der ausführenden Assembly finden, können Sie sie aus der gleichen Quelle deklarieren.

Dies ist wiederum nur eine Heuristik und wird im allgemeinen nicht zufriedenstellend sein. In der Tat ist es ziemlich einfach, ein Gegenbeispiel zu finden.

Aber andererseits, wenn ich meine eigenen Lösungen als Test-Set nehme, würde diese Heuristik perfekt funktionieren, dank der Tatsache, dass alle meine Projekte mit Root-Namespace kommen, was der Name meines Unternehmens ist ist nicht wahr für die - ziemlich offensichtlich in diesem eingeschränkten Bereich.

Ein offensichtliches Gegenbeispiel ist, wenn Sie einige Ihrer eigenen Projekte als NuGet-Pakete bereitstellen. Dann teilen sie sich den Namensraum, sind aber nicht Teil der Lösung.

Fazit ist, dass diese heuristische Lösung wahrscheinlich nicht Ihre Probleme lösen wird. Aber ich hoffe, dass Sie zumindest einen Teil davon auswählen und mit anderen Ideen kombinieren können, um eine angemessene Lösung zu finden.

2

In der Zwischenzeit habe ich

AppDomain.CurrentDomain.GetAssemblies().Where(x => x.FullName.Contains("SolutionName")); 

weil alle Namen meines Projekts gehören die Lösung Namen verwenden werde.

Nicht ideal und hoffe, dass jemand eine bessere Lösung hat.

0

Was ich in diesem Fall normalerweise mache, ist einen Präfixnamen zu setzen und dann alle Assemblies mit diesem Präfix zu bekommen, zum Beispiel meine Projekte wie EX zu benennen."ProjectName" könnte ich verwenden:

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
List<Assembly> myAssemblies = new List<Assembly>(); 

foreach (Assembly assembly in assemblies) 
{ 
    if (assembly.GetName().Name.Contains("EX.")) 
    { 
     myAssemblies.Add(assembly); 
    } 
} 

Hoffe, das hilft.