Ich versuche, ein Code-Generierungs-Tool zu schreiben. Für dieses Tool ist es wichtig, dass der generierte Code vor dem Erstellen verfügbar ist (z. B. für IntelliSense). Ich weiß, Visual Studio wird den Projektbuildplan zumindest teilweise automatisch auswerten, um IntelliSense zu generieren, aber ich kann nicht viele Informationen zu den Details finden.
Als ein einfaches Beispiel möchte ich sagen, dass ich alle Elemente mit der Build-Aktion None
übernehmen und kompilieren möchte. Ich habe ein Projekt wie folgt:
Eine Möglichkeit zum Kompilieren von Bar.cs
besteht darin, dem Projekt Folgendes hinzuzufügen:
Wenn ich das so mache, verhält sich Visual Studio im Prinzip so, als hätte Bar.cs
die Aktion Compile
, mit der sie beginnen soll. IntelliSense ist vollständig verfügbar. Wenn ich eine Änderung in Bar.cs
vornehme, wird sie sofort in IntelliSense reflektiert, wenn ich Foo.cs
bearbeite, und so weiter. (So gut wie die Hintergrundoperation normalerweise ist).
Sagen Sie jedoch, anstatt den Eintrag None
direkt zu kompilieren, möchte ich ihn in das Verzeichnis obj
kopieren und ihn dann von dort kompilieren. Ich kann dies tun, indem ich das IndirectCompile
-Ziel auf folgendes setze:
Dadurch wird IntelliSense nicht mehr aktualisiert. Die Aufgabe funktioniert bei Build, Abhängigkeitsanalyse und inkrementeller Erstellung. Visual Studio wird automatisch beendet, wenn eine Eingabedatei gespeichert wird.
Das führt also zu der Titelfrage: Wie wählt Visual Studio Ziele für IntelliSense aus oder nicht? Die einzige offizielle Dokumentation, die ich gefunden habe, war diese , speziell die "Design-Time IntelliSense "Abschnitt. Ich bin mir ziemlich sicher, dass mein Code alle diese Kriterien erfüllt. Was vermisse ich?
Nach einigen Tagen des Experimentierens und Stöberns im Debugger habe ich die Antwort gefunden, und leider ist diese Antwort, dass dies nicht möglich ist (zumindest nicht in einer klar unterstützten Weise - da bin ich mir sicher Möglichkeiten, das System auszutricksen).
Wenn ein Projekt geladen wird und sich das Projekt selbst ändert (Dateien hinzugefügt / entfernt, Build-Aktionen geändert usw.), wird der Build von IntelliSense ausgeführt ( csproj.dll!CLangCompiler::RunIntellisenseBuild
). Dieser Build führt Aufgaben bis einschließlich der Csc
Aufgabe aus. Csc
wird nicht normal ausgeführt, sondern füttert seine Eingaben einfach in den Host (Visual Studio).
Ab diesem Zeitpunkt verfolgt Visual Studio die Dateien, die als Sources
für die Aufgabe Csc
angegeben wurden. Es überwacht diese Dateien auf Änderungen, und wenn sie sich ändern, aktualisieren Sie IntelliSense. Wenn ich also Bar.g.cs
manuell bearbeite, werden diese Änderungen übernommen. Die Build-Tasks selbst werden jedoch erst wieder ausgeführt, wenn sich das Projekt ändert oder ein Build explizit angefordert wird.
Also, das ist enttäuschend, aber nicht überraschend, schätze ich. Es erklärt auch etwas anderes, worüber ich mich schon immer gewundert habe - XAML-Dateien mit einem Code-Behind neigen dazu, eine benutzerdefinierte Tool-Aktion von MSBuild:Compile
zu haben, vermutlich genau aus diesem Grund.
Ich werde das als die Antwort markieren, aber ich würde gerne erfahren, dass ich falsch liege und dass ich etwas verpasst habe.
Tags und Links visual-studio msbuild intellisense