2009-07-03 15 views
8

Ich möchte die Verweise in den Projekten in meiner Visual Studio-Lösung programmatisch aktualisieren.Visual Studio-Projektverweise programmgesteuert aktualisieren

Ich habe rund 15 Projekte in meiner Lösung und wenn ich entwickle/Debugging Ich möchte die Verweise auf die Projekte innerhalb der Lösung zeigen.

Als Teil meiner Freigabeprozedur muss ich manchmal eine Kopie eines Projekts erstellen und dann die Verweise aktualisieren, um auf erstellte DLLs in einem bestimmten Ordner zu zeigen.

Ich kann die Struktur der Projektdateien arbeiten und wie Referenzen in ihnen arbeiten, und ich denke ein Kommandozeilen-Tool für den Bau der Projektdateien und ändern Referenzen zu analysieren, wie erforderlich.

Meine Fragen sind:
1. Klingt das eine vernünftige Sache
2. zu tun Hat jemand Erfahrung dieser und/oder wie zwischen der Entwicklung und geben sie Griff Schaltmodi
3. Hat jemand irgendwelche Bibliotheken, die sich mit dem Parsen von Visual Studio-Projektdateien befassen.

KLARSTELLUNG:

Danke für die Antworten. Vielleicht sollte ich einige Situationen klären, in denen ich dies nutzen möchte.

a) Meine Anwendung enthält 15 Projekte. Ich versuche, die Lösung für das, woran ich gerade arbeite, so klein wie möglich zu halten, also sage ich, dass ich 5 Projekte in meiner Lösung habe. Ich muß jetzt zu debuggen/Entwicklung eines der Projekte nicht in der Lösung, damit ich dieses Projekt hinzufügen, aber ich muß: - die Referenzen in den ursprünglichen Projekten gesetzt Verweise auf Punkt eher zu projizieren als kompilierte DLLs - die Referenzen in der ändern neu hinzugefügte Projekt mit dem entsprechenden Projekt-zu-Punkt verweist

ich mein Werkzeug, dies zu tun automatisch und der einzige Weg, möchte ich wissen, um so in der jetzigen Dateien die Projekt

b) im Rahmen eines Service manipuliert pack build procedure Ich erstelle eine Kopie von einem der Projekte, führe die notwendigen Codeänderungen durch und baue mit Visual Studio. Um dies zu tun Ich habe die Hinweise alle auf die kompilierten DLLs ändern

+0

Gary, müssen Sie die VS-Version von Thunk! – Jon

+0

Verdammt richtig! - wo ist es? –

Antwort

9

Ich denke, eine bessere Lösung sein würde Bedingte Blöcke auf Ihren Referenzen innerhalb der Projektdatei direkt zu verwenden. Dann müssen Sie nur ein bestimmtes Flag während des Msbuild für den Build "release" setzen und es werden die richtigen Referenzen aufgenommen.

Zum Beispiel

<ItemGroup Condition="'$(IsRelease)'=='True'"> 
    <Reference Include="..." /> 
</ItemGroup> 
<ItemGroup Condition="'$(IsRelease)'!='True'"> 
    <Reference Include="..." /> 
</ItemGroup> 
+0

Ja. Das sieht besser aus als meine Antwort;) –

+0

Verzeihen Sie meine Ignoranz, aber sind das nicht beide wahr? IE: Wenn es wahr oder falsch ist. Vielleicht verpasse ich gerade etwas. –

+0

@ Jeremy, du hast nichts verpasst. Ich habe die Bedingung in der letzten Sekunde geändert und bin nicht auf die ganze Antwort zurückgegangen. Fixed – JaredPar

0

klingt wie eine seltsame Situation.

Mein Vorschlag ist dies.

  1. Teilen Sie die Projekte, die vorgefertigte Versionen haben, in eine separate Lösung auf.Haben sie alle

    \ Baugruppen \ fromsource

  2. Kopieren Sie die vorkompilierte diejenigen in zu

    bauen;

    \ assembly \ prebuilt

  3. vor dem Rest der Projekte zu entwickeln, kopieren Sie entweder Verzeichnis in

    \ assembly \ Entwicklung

  4. Ihre Projekte Wechseln Sie in den Versionen in \ assembly \-zu-Punkt Entwicklung.

So, jetzt Sie immer Ihr Produkt gegen vorkompilierte Binaries in einem bekannten Ordner bauen, so dass Sie nie Ihr Projekt ändern müssen. Aber Sie können zwischen den Versionen nach Belieben wechseln.

Ändern Sie für Bonuspunkte ein Prebuild-Ereignis, um die DLLs zu kopieren, bevor die Erstellung beginnt, und variieren Sie den Quellordner je nach Konfiguration. Fügen Sie dann neben DEBUG und RELEASE eine PREBUILT-Konfiguration hinzu.

1

Tiger, Tiger ROAR !!!

Hierbei werden DTE und VSProject für programmatische Hinzufügeverweise verwendet. Ich habe den Code für die Mehrheit der Erklärung kommentiert. Aber um hinzuzufügen, habe ich eine Menge anderer Extrareferenzen geworfen, weil ich ein bisschen faul bin. Aber sortiere einfach mit Visual Studio und du solltest in Ordnung sein. Wenn es aus irgendeinem Grund nicht kompiliert, fühlen Sie sich frei, mich anzuschreien.

 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Windows.Forms; 
using EnvDTE; 
using EnvDTE80; 
using EnvDTE90; 
using EnvDTE90a; 
using Extensibility; 
using Microsoft.VisualStudio.Shell; 
using Microsoft.VisualStudio.Shell.Design; 
using Microsoft.VisualStudio.Shell.Interop; 
using VSLangProj; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Disclaimer: 
      //I am doing this through an extention, Getting 
      //a ref to DTE may not work quite the same for you as 
      //there are several different ways to do it. But the 
      //VSProject stuff shouldn't be an issue 

      //Get your DTE Reference, I'm using DTE2 from EnvDTE80 
      //I hadn't dug into whats the earilest compatible version 
      //The Package is Microsoft.VisualStudio.Shell.Package 
      DTE2 _appObject = Package.GetGlobalService(typeof(DTE)) as DTE2; 

      //This gets the first project in the solution set and casts it as a VSProject 
      //Note that Web projects use a different type , Something like VSWebProject 
      //or something I forget... 
      var pj = (VSProject)_appObject.Solution.Projects.Item(1).Object; 

      //Your dll path 
      pj.References.Add(@"c:\MyRefs\Pastry.dll"); 
     } 
    } 
} 


+1

Nicht die vollständige Antwort auf Ihre Frage, aber ich dachte, es würde helfen zu zeigen, wie es einfach in Code getan werden kann. – Terrance

+1

Das ist absolut genial, danke! Wenn Sie für den Datensatz die Referenz hinzufügen möchten, die die (VSProject-) Umwandlung unterstützt, suchen Sie im "Referenzmanager" nach "lang" und fügen Sie dann VSLangProj und VSLangProj110 hinzu (wenn Sie Visual Studio 2012 verwenden). – Contango

1

Ich glaube nicht, gibt es eine einfache Antwort auf Ihre erste Frage. In der Regel würde ich empfehlen, diese Situation zu vermeiden. Es ist schwierig, manuell zu handhaben, und der Code, um es zu verwalten, ist nicht trivial.

Das heißt, ich habe eine Situation in meinem Job gerannt, wo ich einfach nicht das Problem umgehen konnte. In unserem Fall haben wir daran gearbeitet, ein SDK zu veröffentlichen, das eine Reihe von Beispielprojekten enthalten musste. Die "Entwicklungs" -Version dieser Projekte verwendete sowohl Projektreferenzen als auch Verweise auf Bibliotheken von Drittanbietern.

Das bringt uns zu # 3, die im Grunde ja ist. Ich habe tatsächlich eine open source project with a library, a simple windows utility and a NAnt extension to automatically change project references to dll references freigegeben. In der Tat behandelt es auch das Verschieben dieser Bibliotheken von Drittanbietern in den gleichen lokalen Ordner und aktualisiert diese Verweise in der Projektdatei.

Diese Lösung ist nicht perfekt und es gibt viele Verbesserungen, die ich gerne hinzufügen würde, aber es funktioniert für unsere Situation. Ein Teil unseres Releaseskripts, der allesamt in NAnt ist, führt diesen Prozess aus, um alle Referenzen auf einen relativen Pfad zu tauschen. Dann können wir das ganze Setup leicht bündeln. Eines Tages werde ich vielleicht die Zeit haben, eine MSBuild-Aufgabe zusammen mit dem Projekt hinzuzufügen.

Nochmals, ich denke, es ist das Beste, dies so weit wie möglich zu vermeiden, aber wenn Sie wie ich stecken bleiben - sollte der Code, den ich veröffentlicht habe, zumindest helfen.

+1

Willkommen bei Stack Overflow! Danke, dass du deine Antwort geschrieben hast! Bitte beachten Sie, dass Sie die nützlichen Punkte einer Antwort hier auf dieser Website posten sollten oder dass Ihr Beitrag gelöscht werden könnte [Siehe die FAQ, in der Antworten erwähnt werden, die "kaum mehr als ein Link" sind (http://stackoverflow.com)/faq # löschen). Sie können den Link immer noch einfügen, wenn Sie möchten, aber nur als "Referenz". Die Antwort sollte eigenständig stehen, ohne die Verbindung zu benötigen. –

Verwandte Themen