2016-07-22 27 views
2

Ich bin ein C# -Projekt mit den Roslyn CodeAnalysis APIs kompilieren, wie in der folgenden snipet:kopieren App.config, wenn sie mit CodeAnalysis.Compilation.Emit Kompilieren

... 
EmitResult emitResult = null; 
using (FileStream outputFileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) 
{ 
    emitResult = compilation.Emit(outputFileStream, null); 
} 
... 

Das funktioniert perfekt. Wenn ich jedoch ein ausführbares Projekt kompilieren möchte, das eine App.Config-Datei enthält, wird diese Datei nicht im Ausgabeverzeichnis ausgegeben (ähnlich wie es beim Kompilieren über Visual Studio ausgegeben wird), was problematisch ist, wenn Sie einige analysieren möchten konfiguriert zur Laufzeit aus dieser Datei.

Ich weiß, dass es nicht standardmäßig ausgegeben werden sollte, aber ich würde wahrscheinlich eine Option aktivieren oder irgendwie den App.Config-Pfad aus dem Projekt-Objekt extrahieren und es selbst ausgeben? Ich kann anscheinend keine Informationen diesbezüglich finden, und die Projektklasse scheint keine Informationen bezüglich der Konfigurationsdateien zu enthalten (außer ich verpasse etwas).

Gibt es eine bestimmte API, die ich verwenden muss, um das oben genannte zu erreichen? Irgendwelche Hinweise auf vorhandenen Code, der dies zur Verfügung stellt?

Vielen Dank!

Antwort

5

Roslyn ist kein Build-System, es ist ein Compiler. Es kann nur Code in Assemblys (und PDBs) umwandeln. Wenn Sie eine .csproj in Visual Studio kompilieren, liest MSBuild alle Eigenschaften und Elemente in der Projektdatei und übersetzt sie in eine Reihe von Schritten, die unter anderem den Roslyn-Compiler aufrufen, App.config Dateien in das Ausgabeverzeichnis kopieren, Verweise kopieren, usw.

Obwohl Roslyn MSBuild-Projektdateien lesen kann, werden diese Informationen nur zu Kompilierungszwecken verwendet, z. B. zum Suchen von Referenzen.

Wenn Sie also Assemblys dynamisch kompilieren, müssen Sie die Datei App.config selbst kopieren (Hinweis - VS gibt diese Datei nicht aus - sie kopiert und benennt sie nur um).

+2

Eine leichte Korrektur: Es gibt auch alle möglichen Mutationen, die mit der app.config passieren können, um Redirects und andere Systeme zu binden. Wenn es für das Szenario wichtig ist, müssen Sie möglicherweise nur MSBuild aufrufen. –