Laden...

T4 Template - Semikolon Fehler [==> Fehler durch falsches Quoten]

Erstellt von weismat vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.502 Views
W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 10 Jahren
T4 Template - Semikolon Fehler [==> Fehler durch falsches Quoten]

Ich versuche aus einer csv-Datei mittels t4 konstante Produktdaten zu erzeugen.
Irgendwie bekomme ich immer einen Semikolon-Fehler beim Ausfuehren des Template Codes - mir ist aber ueberhaupt nicht klar, warum...


<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Windows.Forms.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #> 
// This is the output code from your template
// you only get syntax-highlighting here - not intellisense

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;
namespace Product{
  class ProductCache {
		private static ProductCache _instance;
        private Dictionary<string, Product> ProductId2Product=new Dictionary<string, Product>();
        
        private ProductCache()
        {				
<# 
using (var fs = File.OpenRead("productlist.csv"))
   using (var textReader = new StreamReader(fs))
   {
        textReader.ReadLine();
      while (!textReader.EndOfStream) {			
			var line = "Add("+"""+textReader.ReadLine()+"""+");";
			this.Write(line);			
		}
	}            
#>	
        }

        public static ProductCache Instance
        {
            get
            {
                if (_instance != null) return _instance;
                _instance = new ProductCache();
                return _instance;
            }
        }

		private void Add(string csvString) {
			var product=new Product(csvString);
			ProductId2Product.Add(product.ProductId, product);
		}

     }
  }

Ich habe den Code auch in einer Consolen Anwendung mit Console.Write statt this.Write ausprobiert und er kompiliert - deswegen stehe ich jetzt auf dem Schlauch.

16.834 Beiträge seit 2008
vor 10 Jahren

Wahrscheinlich erzeugt

<#
using (var fs = File.OpenRead("productlist.csv"))
    using (var textReader = new StreamReader(fs))
    {
         textReader.ReadLine();
       while (!textReader.EndOfStream) {
             var line = "Add("+"""+textReader.ReadLine()+"""+");";
             this.Write(line);
         }
     }
 #>

ungültigen Code, der nachher den Fehler auslöst.

W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 10 Jahren

Der Fehler passiert beim Pre-Compile, nicht in der generierten Klasse.

S
417 Beiträge seit 2008
vor 10 Jahren

Schaut so aus als wären die Quotes falsch (bzw. nicht) escaped:

var line = "Add("+"\""+textReader.ReadLine()+"\""+");";

So gehts.

W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 10 Jahren

Habs jetzt - T4 ist wirklich ein bisschen tricky - aber auch sehr maechtig.

S
417 Beiträge seit 2008
vor 10 Jahren

Lag es denn jetzt an den Quotes?
Denn das wäre ja keine Eigenheit von T4...

W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 10 Jahren

Ja, lag an den Quotes - aber es mehr die Kombination von Kompilier- und Laufzeitfehlern, die mich bei T4 verwirrt hat.
Bei T4 "Run Custom Tool" werden ja sowohl die T4-Anweisungen kompiliert und dann anschliessend zur Generation der Klassen ausgefuehrt.
Das Problem sind mehr die komischen Fehlermeldungen.
Am Schluss habe ich halt wirklich nach jeder Zeile T4 laufen lassen.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo weismat und alle anderen Hilfesuchenden,

Das Problem sind mehr die komischen Fehlermeldungen.

weshalb du sie uns trotz deiner langjährigen Forenerfahrung und trotz [Hinweis] Wie poste ich richtig? Punkt 5 verschwiegen hast?

Es ist ein - leider sehr verbreiteter - Fehlschluss, dass eine Fehlermeldung, die einem selbst nicht hilft, generell nutzlos ist. Was dem Hilfesuchenden nichts sagt, kann und wird für den Helfer trotzdem oft der Schlüssel sein. Deshalb immer die exakte Fehlermeldung mit angeben, und zwar zusammen mit der exakten Codestelle, auf die sie sich bezieht. Und das am besten in [****ERROR]-Tags.

herbivore

W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 10 Jahren

Die erste Fehlermeldung lautet "Missing Semikolon" wie im Titel - Du findest keine Code-Stelle, da der Fehler in der generierten .cs Datei angezeigt wird - nicht im eigenen Code.

S
417 Beiträge seit 2008
vor 10 Jahren

Also bei mir wurde die Stelle angezeigt, deswegen wusste ich gleich wo ich suchen muss (siehe Anhang)

W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 10 Jahren

Wahrscheinlich habe ich die Fehlermeldung übersehen - ich habe mehr auf die erste Fehlermeldung geschaut und die war ein fehlendes Semikolon.
Ich hatte halt lange nix mehr mit T4 gemacht und habe wirklich ne Stunde dran rumgedoktert - "Metaprogramming in .NET" wieder angeschaut und nicht den Fehler gefunden...