Wie man Metadaten von Klassen erhält, ohne das Projekt zu kompilieren

8

In unserem Projekt verwenden wir eine Menge T4-Code-Generierung. Wir verwenden ein ORM namens DataObjects.Net von X-Tensive. Wir haben ein bisschen ein Hühnerei-Problem. Wir müssen die Klassen des ORM kompilieren, bevor wir die Metadaten der Assembly verwenden können, um Code zu generieren. Dann, wenn der Code generiert wird, können wir das Modell erneut kompilieren, aber jetzt in Kombination mit generiertem Code (Teilklassen). Der meiste benutzerdefinierte Code in den Modellklassen kann nicht ohne den generierten Code kompiliert werden.

Wie wir es gelöst haben, ist eine separate Konfiguration in VS2013 namens "Model". In dieser Konfiguration ist ein 'Bedingtes Kompilierungssymbol' Aufruf 'JUSTMODEL' vorhanden. Der gesamte Code, der nicht ohne den generierten Code kompiliert wird, wird zwischen die Compiler-Direktiven #if! JUSTMODEL #endif gesetzt, wodurch dieser Code nicht für die 'Model'-Konfiguration kompiliert wird.

Das ist ein bisschen langweilig. Wir haben eine kleine Erweiterungsanwendung erstellt, die diesen Prozess automatisiert, aber es wird immer zeitaufwändiger, den Prozess auszuführen.

Nun habe ich mich gefragt, ob es möglich ist, die Metadaten der Model-Assembly zu erhalten, ohne die Assembly über irgendeine Art von Erweiterbarkeits-API aufzubauen. Ich sehe viele Werkzeuge in Visual Studio, die die in den Editoren geladenen Klassen verstehen und mir ein Feedback geben (wie intellisense).

    
Paul Sinnema 15.03.2014, 15:12
quelle

2 Antworten

7

Es gibt einen noch besseren Weg als NRefactor. Ich habe das CodeModel in Visual Studio entdeckt. Es gibt mir alle Metadaten, die ich brauche, um unseren Code zu generieren. Sie können eine Menge Details finden, wie man das im Netz erreicht, wie hier:

  1. Microsoft
  2. Tangible

und viele andere Orte. Die Codierung ist ein wenig anders als in C # wegen der dynamischen Natur der Daten, aber wenn Sie den Dreh raus, ist es ziemlich einfach und sehr mächtig.

    
Paul Sinnema 25.03.2014, 07:13
quelle
2

Ich würde in Erwägung ziehen, NRefactory Bibliothek oder ähnliches zu verwenden. Die Idee von NRefactory ist Roslyn ähnlich und sollte Ihr Problem lösen. Wenn ich Sie richtig verstehe, benötigen Sie vor der Kompilierung Informationen über Klassen und ihre Mitglieder. Der einfachste Code auf der Basis von NRefactory, der für das Abrufen der Klassenliste zusammen mit Informationen über Methoden und Eigenschaften zuständig ist, könnte folgendermaßen aussehen:

%Vor%

In diesem Beispiel wird nur die Syntaxanalyse des Quellcodes durchgeführt. Sie können jedoch auch eine semantische Analyse mit NRefactory durchführen, indem Sie die Klasse CSharpAstResolver verwenden.

    
Michał Komorowski 23.03.2014 15:10
quelle