Zur Zeit wird gefiltert nach: .net
Filter zurücksetzen

Metaprogramming in .NET

Es gibt viele Ansätze, um mehr Flexibilität in den Entwicklungsprozess zu bekommen, einer davon ist Metaprogrammierung. Dabei handelt es sich meist um ein zusätzliches Level in Softwaresystemen, das zu mehr Flexibilität beitragen soll. In .NET gibt es dafür mehrere Ansätze. Aus diesem Grund habe ich damit angefangen, ein Mindmap zu erstellen, da mich das Thema schon seit längeren interessiert und in diversen Projekten auf die eine oder andere Weise begleitet hat.

Neben T4 wird aus meiner Sicht auch das Rosyln-Projekt ein interessanter Kandidat werden, weil es die typischen Anforderungen wie lesender, schreibender Zugriff ermöglicht und durch die Kombination mit statischem Code die Änderung der Semantik zulassen soll. Bin gespannt.

Leider wird die CTP erst Mitte Oktober bereitgestellt, werde auf jeden Fall damit spielen. ;-) Aktuell gibt es einen kleinen Ausblick im 3. Teil der Build-Präsentation Future directions for C# and Viusal Basic  von Anders Hejlsberg (ab der 40. Minute). 

Zurück

23.12.2010
10:58

Es ist doch nicht Ostern, wo hat sich die Basisklasse MembershipProvider versteckt?

Sitze gerade an einer Implementierung eines benutzerdefinierten MembershipProviders. Eigentlich nicht das erste Mal – Verweis auf System.Configuration und System.Web und es kann mit der Realisierung begonnen werden, aber in .NET 4.0 gibt es eine kleine Änderung. Die Basisklasse ist nicht mehr in der Assembly System.Web. Neu wird ein Verweis auf die Assembly System.Web.ApplicationServices benötigt, damit die abstrakte Basisklasse MembershipProvider verwendet werden kann.

Zurück

04.11.2010
23:38

Preprocessed Templates mit Referenzen im Text Template verwenden

Preprocessed Templates, zu Deutsch auch vorverarbeitete Textvorlage genannt, haben den Vorteil, dass sie keine feste Abhängigkeit zu Visual Studio besitzen. Sie können aber auch dazu genutzt werden, um den Output vor beliebigen Anpassungen zu schützen, damit bei Änderungen nicht immer wieder unliebsame Prozesse (Validierung ;-)) in Gang gesetzt werden.

Machen wir ein kleines Beispiel, um zu sehen, wie sich die Theorie von der Praxis unterscheiden kann.

Ich erstelle ein Preprocessed Template, dass ich in einem normalen Text Template verwenden will. Dieses benötigt für seine Aufgabe 2 zusätzliche Referenzen auf externe Assemblies. Füge ich die Referenz zu meinen Preprocessed Template hinzu und teste dieses Template in einer Konsolen-Anwendung, dann erhalte ich mit folgendem Code:

Abbildung 1
Abbildung 1 Initialisierung und Ausgabe des Preprocessed Templates in einer Konsolenanwendung

die Ausgabe:

Abbildung 2
Abbildung 2 Erzeugter Testcode mit Hilfe eines Preprocessed Templates in einer Konsolenanwendung

Wenn ich innerhalb einer normalen Textvorlage dieses Ergebnis haben will, dann ist der Code hierfür ähnlich, nur dass die Assembly innerhalb der Textvorlage referenziert werden muss. Die nachfolgende Abbildung verdeutlicht dies:

Abbildung 3
Abbildung 3 Initialisierung und Ausgabe des Preprocessed Templates in einer Textvorlage

Das Ergebnis ist jedoch nicht die Ausgabe des zu erzeugenden Test, sondern eine Fehlermeldung:

Abbildung 4
Abbildung 4 Fehlermeldung das referenzierte Assemblies nicht gefunden worden sind

Wie kommt die Fehlermeldung:

Running transformation: System.IO.FileNotFoundException: Could not load file or assembly 'StoryQGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Das System kann die angegebene Datei nicht finden. File name: 'StoryQGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' at T4PreProcessed._03_StoryQ.StoryQTestTemplate.TransformText()

zustande?

Erklären lässt sich dies auch nur mit der temp. AppDomain und die Folge davon, dass die abhängigen Assemblies aus diesem Grund nicht geladen werden. Eine Variante wäre jetzt diese Assemblies innerhalb der Textvorlage zu referenzieren. Wird dieser Ansatz gewählt, besteht das sporadische Funktionieren der Textvorlage, ähnlich der Serialisierungsausnahme bei parametrisierten Vorlagen.

Wie lässt sich das Problem aber mit den Preprocessed Templates in den Griff bekommen? Dazu ist es interessant zu wissen, dass T4 die DLL-Dateien innerhalb des GAC und im Public-Assembly Verzeichnis von Visual Studio durchsucht. In meinem Szenario kopiere ich die 2 DLL’s in den öffentlichen Ordner von Visual Studio. Dadurch können die Assemblies aufgelöst werden und komme zu folgendem Ergebnis:

Abbildung 5
Abbildung 5 Ausgabe des Preprocessed Templates bei der korrekten Auflösung der Assemblies

Solange am Preprocessed Template entwickelt wird, ist es nicht ratsam, dieses innerhalb der Text Templates zu verwenden, da auch der Ansatz mit dem Öffentlichen Verzeichnis die DLL’s sperrt und erst wieder freigibt, wenn die jeweilige Solution geschlossen wurde.

Ist ein wenig speziell das Ganze, ob es wohl eine elegantere Lösung gibt?

Zurück

23.08.2010
22:46

dotnet-kicks.de und die Steigerungsform von kick-it ist banish-it

Irgendwie kam ich auf die Idee, dass ich auf meiner Seite auch den DNK-Button platzieren könnte. Der nächste Schritt war also, die Seite www.dotnet-kicks.de genauer zu betrachten und mich zu registrieren. Da ich den t3blog von Snowflake einsetze, hätte es mich natürlich auch interessiert, für diesen eine Extension zu entwickeln, um so auch mein PHP-Wissen ein wenig zu nutzen. Soweit sollte es aber nicht kommen. ;-)

Nur drei Tage später hatte ich dann ein Mail mit dem Betreff [dotnet-kicks.de] vom Betreiber dieser Plattform mit folgenden Inhalt im Postfach:

Sie wurden von einem Moderator von dotnet-kicks.de verbannt.

Bitte teilen Sie uns mit, wenn dies irrtümlich geschehen sein sollt.

Ok , meine erste Überlegung war, warum wurde ich da wohl verbannt und habe natürlich per Mail nachgefragt, aus welchen Gründen mein Account gesperrt wurde.

Ehrlich gesagt habe ich keine Ahnung, was ich auf dieser Plattform falsch gemacht haben könnte, da ich innerhalb der drei Tage nur das Passwort geändert und mich in die Infos zum DNK-Button eingelesen habe. Die Betreiber müssen jedenfalls so sauer auf mich sein, dass ich nicht einmal eine Antwort erhalten habe. ;-)

Mein Blog wird also ohne den DNK-Button der deutschen Plattform bleiben.

Zurück

19.08.2010
22:41

.NET 4.0 Code Contracts – Must use the rewriter when using Contract.Requires<TException>

Für ein paar Beispiele möchte ich die Code Contracts intensiver nutzen, damit ich eine bessere Routine bekomme. Das erste Mal stand ich an, als ich Argumente einer Methode auf null prüfen wollte, um im positiven Fall eine entsprechende Exception zu erzeugen.

Bisher war mein Ansatz so:

C# (throw Exception) 
public virtual void Add (T entity)
{
    If (entity == null)
    {
        throw new ArgumentNullException("entity", "The parameter entity is null.") ;
    }
    …
}

Zukünftig soll es bei mir so aussehen:

 C# (Contract)
public virtual void Add (T entity)
{
    Contract.Requires<ArgumentNullException>(entity != null, "The parameter entity is null");
    …
}

Nach der Anpassung in die Contract-Syntax begrüsste mich jedoch folgende Meldung:

Abbildung 1
Abbildung 1 Fehlermeldung Must use the rewriter...

Ich fand schnell den Hinweis, dass bei den Projekteigenschaften unter Code Contracts die Einstellung "Perform Runtime Contract Checking" auf "FULL" gestellt werden muss, nur in meinen Projekteigenschaften konnte ich diesen Reiter nicht finden.

Abbildung 2
Abbildung 2 Projekteigenschaften mit fehlendem Reiter Code Contracts

Damit dieser Reiter mit aufgeführt wird, muss von den MS DevLabs mind. die Version 1.4.3 der Code Contracts heruntergeladen und installiert werden.

Nach erfolgreicher Installation muss dann nur noch die „Finish“-Schaltfläche geklickt werden.

Abbildung 3
Abbildung 3 Erfolgreiche Installation

Und endlich, der Reiter Code Contracts existiert in den Projekteigenschaften.

Abbildung 4
Abbildung 4 Projekteigenschaften mit Reiter "Code Contracts "

Damit diese Fehlermeldung nun nicht mehr erscheint, muss in der Projektmappe, welche die Contract-Definitionen enthält der Assembly Mode auf "Standard Contract Requries" und die Checkbox "Perform Runtime Contract Checking" auf "FULL" gesetzt werden. Mit dieser Anpassung ist der Fehler behoben.

Zurück

Translate this page

Kategorien

  • [-].NET Development (207)
  • [-]Datenbank (24)
  • HTML (1)
  • Konfiguration (12)
  • Mind Map (9)
  • Off-topic (9)
  • Open Source (3)
  • Qualität (6)
  • Sharepoint (2)
  • Sicherheit (2)

Archiv

Social Bookmarking

Bookmark bei: Mr. Wong Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Favoriten Bookmark bei: Seekxl Bookmark bei: Favit Bookmark bei: Social Bookmarking Tool Bookmark bei: Power Oldie Bookmark bei: Bookmarks.cc Bookmark bei: Newskick Bookmark bei: Newsider Bookmark bei: Linksilo Bookmark bei: Readster Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Del.icio.us Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz Information