2017-11-10 1 views
0

In Visual Studio 2017, Erstellen eines C# -Projektvorlagenprojekts mit der IWizard-Schnittstelle, öffne ich meinen angepassten Dialog für den Benutzer, aber ich kann nicht feststellen, ob sie zuvor das Kontrollkästchen "Create Directory For Solution" ausgewählt haben. Ich muss dies noch in der RunStarted() - Schnittstellenfunktion wissen, bevor das Project-Objekt generiert wird (mit anderen Worten, ich kann project.DTE.Solution nicht verwenden).

Microsoft's awesome documentation sagt, ich kann nur sehen $ SpecificSolutionName $, aber es kommt immer leer für mich.

In der Zwischenzeit, other StackOverflow questions beziehen sich entweder auf Multi-Projekt-Vorlagen oder haben einfach keine Antwort. Mein spezielles Problem ist eine einfache Ein-Projekt-Vorlage.

Ich habe auch versucht, $ SolutionName $. Nach ein paar frustrierenden Tagen, in denen ich Google erschöpfte, gab ich auf und musste etwas schummeln. Es wäre schön, wenn ich nicht den Namen des erwarteten Lösungsordners erraten müsste, falls es einen gibt. Schlimmer noch, um festzustellen, ob die does-it-even-exist Lösung Ordner ist neu oder nicht finde ich mich Vergleich Ordner Erstellungsdaten. Die Dinge beginnen eine kritische Masse von Hacker-Workarounds zu erreichen.

F: Wie kann ich den Namen des Lösungsordners finden oder zumindest, ob der Benutzer innerhalb von RunStarted() eines Projektvorlagenassistenten einen neuen Lösungsordner erstellt hat?

Antwort

0

Ich habe gelernt, dass ich nur die temporäre Instanz von VS "Attach to Process ..." anhängen und debuggen kann. Also habe ich mir das replacementsDictionary-Objekt angesehen.

Im Gegensatz zu dem, was alle docs sagen, benötigt die Template-Parameter ist eigentlich:

$ SpecifiedSolutionName

$

... und nicht "SpecificSolutionName".

Das ist die Hälfte des Geheimnisses gelöst, aber lass dich davon nicht begeistern. SpecifiedSolutionName tut auch nicht, was die Dokumente sagen, dass es tut.

Von https://docs.microsoft.com/en-us/visualstudio/ide/template-parameters:

Wenn "Lösung Verzeichnis erstellen" nicht aktiviert ist, SpecificSolutionName [sic] ist leer.

Nope. Wenn "create solution directory" nicht aktiviert ist, enthält $ SpecifiedSolutionName $, was auch immer in $ projectname $ ist.

Das wäre für uns genug, wenn das Standardverhalten für ein Lösungsverzeichnis und ein Projektverzeichnis nicht den gleichen Namen hätte. Da dies jedoch häufig vorkommt, kann dieser Wert $ SpecifiedSolutionName $ nicht sagen, ob der Benutzer ein neues Lösungsverzeichnis erstellt hat oder nicht.

So sehe ich immer noch nichts, das direkt meldet, ob der Benutzer dieses Kontrollkästchen ankreuzte oder deaktivierte. Es gibt jedoch eine Logik, durch die Sie springen können, dank eines anderen Template-Parameters namens $ solutiondirectory $.

Das ist auch defekt.

Wenn der Benutzer "Create directory for solution" ankreuzt, ist $ solutiondirectory $ das Verzeichnis, in dem die Lösungsdatei gespeichert wird. Wenn der Benutzer "Create directory for solution" löscht, dann ist $ solutiondirectory $ das Verzeichnis, das das Verzeichnis enthält, in dem sich die Lösungsdatei befindet, und ist daher wahrscheinlich höher im Dateisystem, als Sie möchten.

Was $ solutiondirectory $ Berichte ist eigentlich nur $ Zielverzeichnis $ \ .. \. Das Verzeichnis oberhalb des Verzeichnisses, in dem sich die Datei Projekt befindet. Es spielt keine Rolle, ob "Verzeichnis für Lösung erstellen" aktiviert wurde oder nicht, der $ solutiondirectory $ Parameter kümmert sich um die Projektdatei & Verzeichnis, nicht um die Lösung.

Also zurück zur Frage, woher wissen wir, ob der Benutzer "Create directory for solution" angekreuzt hat, wenn Lösung und Projekt beide den gleichen Namen haben?

Zwei Unrecht machen in diesem Fall fast ein Recht. Vergleichen Sie $ SpecifiedSolutionName $ mit dem endgültigen Pfadelement in $ solutiondirectory $. Wenn diese unterschiedlich sind, hat der Benutzer definitiv "Verzeichnis für Lösung erstellen" deaktiviert. (Weil die ehemaligen wird der Projektname, und dieser wird, was das Dateisystem etwas höher ist.)

Wenn sie gleich sind, hat der Benutzer wahrscheinlich, dass das Feld markiert. Aber es gibt noch eine Sache zu beachten. Vielleicht hat das Verzeichnis aus irgendeinem Grund auch den gleichen Namen wie das Projekt- und/oder Lösungsverzeichnis. Benutzer können so komisch sein. Ich kenne keinen sicheren Weg, um diese Situation zu erklären (vielleicht gibt es mehr Verzeichnisse mit dem gleichen Namen), also überlasse ich es als etwas, auf das ich achten muss.

+1

Und ich habe festgestellt, dass in VS2017, V15.5.4 $ SpecifiedSolutionName $ nicht ersetzt wird, aber $ specifiedsolutionname $ tut. Seufzer. – Dullroar

+0

Wow.Critical für mich, das zu wissen .. Ich werde bald wieder daran arbeiten. Danke für die Berichterstattung. – Xenial

Verwandte Themen