Tipps und Tricks rund um .NET und Visual Studio

C# 6 und Visual Studio Basic 14 in ASP.NET-Webseiten verwenden
Kommentare

Dr. Holger Schwichtenberg (MVP) teilt in der Kolumne „.NETversum“ sein Expertenwissen rund um .NET-Tools und WPF mit. Lesen Sie hier, wie Sie die im Rahmen von .NET Framework 4.6 erschienenen Sprachversionen C# 6 und Visual Basic 14 verwenden.

Die im Rahmen von .NET Framework 4.6 erschienenen Sprachversionen C# 6 und Visual Basic 14 bieten einige syntaktische Zuckerstückchen für die Softwareentwickler. Dabei lassen sich einige (aber nicht alle) der Sprachfeatures auch in älteren .NET-Versionen verwenden, wenn man Visual Studio 2015 nutzt.

Aber in Inline-Code in ASP.NET-Webprojekten will die Nutzung der neuen Sprachssyntax in den Webseiten (.aspx, .ascx, .cshtml oder .vbhtml) nicht gelingen, selbst wenn man das Projekt auf .NET 4.6 hochstuft. Wenn man zum Beispiel die neue Stringinterpolation in Webseiten wie folgt nutzt: <%# $“Wohnort: {Item.PLZ} {Item.Ort}“%>, dann warnt Visual Studio „Feature ‘interpolated Strings’ is not available in C# 5. Please use language version 6 or greater“, und zur Laufzeit sieht man den Fehler „CS1056: Unexpected character ‘$’“.

Das liegt daran, dass der Programmcode in Webseiten ja nicht von Visual Studio, sondern vom CodeDOM des .NET Frameworks übersetzt wird.

Für die Hochstufung auf C# 6.0 muss man zunächst ein Nuget-Paket installieren: Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Als Nächstes muss man Einträge in der web.config-Datei ergänzen (Listing 1).

<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
</compilers>
</system.codedom>

Danach muss man nun das ganze Projekt neu kompilieren. Dadurch entsteht ein Ordner \bin\roslyn\, in dem u. a. die aktuelle Version der Compiler (csc.exe und vbc.exe) liegen. Danach ist die neue Syntax auch in den Webseiten anwendbar.

Hinweis: Wenn man ein neues Webprojekt in Visual Studio anlegt, mit .NET Framework 4.5, 4.5.1, 4.5.2 oder 4.6 als Grundlage, erfolgen die Paketeinbindung und die web.config-Einstellungen automatisch.

Caching-Datenmenge begrenzen

Viele Softwareentwickler verwenden den Default Memory Cache, den Microsoft in .NET 4.0 eingeführt hat. Dort kann man festlegen, wie lange (zeitlich) der Memory Cache die abgelegten Daten zwischenspeichert. Leider machen sich viele Entwickler keine Gedanken über die Datenmenge im Cache und damit den Speicherbedarf.

Dabei ist es sehr sinnvoll, den Cache auch hinsichtlich der Datenmenge zu begrenzen. Denn ein Cache kann schnell in Größen anwachsen, in denen er das System so stark belastet, dass die Anwendungsleistung darunter leidet (weil immer mehr die Auslagerungsdatei verwendet wird) und der Cache das Gegenteil von dem bewirkt, was beabsichtigt ist. Oder es kommt sogar zum Out-of-Memory-Laufzeitfehler!

Sie denken, dass Sie nur wenige Daten im Cache haben? Ja, das ist vielleicht heutzutage so. Auf Ihrem Entwicklungsrechner. Aber wie sieht es in ein paar Jahren bei Ihren Nutzern aus? Der Default Memory Cache (der immer im Zugriff ist über MemoryCache.Default) hat eine Beschränkung eingebaut, die ist aber sehr hoch, wie Tabelle 1 zeigt.

Tabelle 1: Standardbeschränkungen des Default Memory Cache

Tabelle 1: Standardbeschränkungen des Default Memory Cache

Beim Blick auf die Klasse MemoryCache fällt auf, dass diese Properties schreibgeschützt sind. Man kann sie für den Default Memory Cache nur über die Konfigurationsdatei setzen. Kurioserweise setzt man hier das Speicherlimit in Megabytes statt in Bytes (Listing 2).

<configuration>
  <system.runtime.caching>
    <memoryCache>
      <namedCaches>
        <add name="default" 
           cacheMemoryLimitMegabytes="1000" 
           physicalMemoryPercentage="50"
           pollingInterval="00:01:00" />
      </namedCaches>
    </memoryCache>
  </system.runtime.caching>
</configuration>

Im Programmcode kann man diese Werte nur dann selbst setzen, wenn man eine neue MemoryCache-Instanz erzeugt. Dabei ist das Setzen der Werte nur per NameValueCollection möglich, was etwas befremdlich ist.

MemoryCache cache { get; set; } = MemoryCache.Default;
var config = new System.Collections.Specialized.NameValueCollection();
config.Add("CacheMemoryLimitMegabytes",cacheMemoryLimitMegabytes.ToString());
config.Add("PhysicalMemoryLimitPercentage",physicalMemoryLimitPercentage.ToString());
config.Add("PollingInterval",pollingInterval.ToString());
cache = new MemoryCache("CacheName", config);

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist der Windows Developer ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -