Gibt es #pragma oder eine ähnliche Direktive für generierten C # -Code, um die Zeilennummern des Template-Codes mit der C # -Zeilennummer zu vergleichen?

8

Ich habe ein Templating-System, das dem alten ASP-Code ähnelt. Ich führe dies durch eine Klasse, die das gesamte Ding in C # Quellcode umschreibt, kompiliert und schließlich ausführt.

Was ich mich wundere ist, wenn es eine Art # pragma-ähnliche Direktive gibt, kann ich den generierten C # -Code streuen, der Kompilierungsfehler mit den Zeilennummern in meiner Vorlagendatei übereinstimmt?

Nehmen wir zum Beispiel an, ich habe diese erste und einzige Zeile in meinem Vorlagencode:

%Vor%

Aber um das zu kompilieren, muss ich einen Namespace, eine Klasse, eine Methode und einen Code für den Kesselblech hinzufügen, so dass diese Zeile oben, die Zeile 1 in meiner Vorlagendatei ist, tatsächlich endet Zeile # 17 (Zufallszahl, nur zur Veranschaulichung) im C # -Code. Der Compilerfehler wird natürlich meinen Fehler als in Zeile # 17 und nicht in Zeile # 1 kennzeichnen.

Ich erinnere mich an eine andere Programmiersprache, die ich vorher benutzt habe (obwohl ich mich nicht mehr erinnern kann), dass es eine Direktive hätte, die ich hinzufügen könnte, die die Zeile mit den Fehlerzeilen in eine Reihe bringen würde.

Gibt es so etwas in C # 3.5?

    
Lasse Vågsæther Karlsen 31.08.2009, 17:34
quelle

1 Antwort

16

Sie haben die #line Präprozessordirektive .

  Mit

#line können Sie die Zeilennummer des Compilers und (optional) den Dateinamen für Fehler und Warnungen ändern.

     

Die #line directive könnte in einem automatisierten Zwischenschritt im Build-Prozess verwendet werden. Wenn z. B. Zeilen aus der ursprünglichen Quellcodedatei entfernt wurden, der Compiler jedoch die Ausgabe basierend auf der ursprünglichen Zeilennummerierung in der Datei generieren soll, können Sie Zeilen entfernen und dann die ursprüngliche Zeilennummerierung mit #line .      

Die Anweisung #line hidden blendet die aufeinanderfolgenden Zeilen des Debuggers aus, sodass beim Durchlaufen des Codes durch den Entwickler alle Zeilen zwischen #line hidden und der nächsten #line -Direktive (vorausgesetzt, dass Es ist keine weitere #line versteckte Richtlinie) wird übergangen werden. Diese Option kann auch verwendet werden, um ASP.NET die Unterscheidung zwischen benutzerdefiniertem und maschinengeneriertem Code zu ermöglichen. Obwohl ASP.NET der Hauptabnehmer dieser Funktion ist, wird es wahrscheinlich von mehr Quellgeneratoren verwendet.

     

Eine Anweisung #line hidden wirkt sich nicht auf Dateinamen oder Zeilennummern in der Fehlerberichterstattung aus. Das heißt, wenn ein Fehler in einem ausgeblendeten Block auftritt, meldet der Compiler den aktuellen Dateinamen und die Zeilennummer des Fehlers.

     

Die Anweisung #line filename gibt den Dateinamen an, der in der Compilerausgabe angezeigt werden soll. Standardmäßig wird der tatsächliche Name der Quellcodedatei verwendet. Der Dateiname muss in doppelten Anführungszeichen ("") stehen und muss mit einer Zeilennummer beginnen.

    
Sam Harwell 31.08.2009, 17:39
quelle