2016-09-09 1 views
2

Ich muss Quellcode des großen Projekts dynamisch kompilieren und Ausgabetyp kann Windows-Anwendung oder Klassenbibliothek sein. Code ist schön ausgeführt und es ist möglich, .dll oder .exe-Dateien zu machen, aber das Problem ist, dass, wenn ich versuche, .exe-Datei zu machen - es verliert Ressourcen wie das Projektsymbol. Die Ergebnisdatei enthält keine Assemblierungsinformationen für.Dynamisch kompiliertes Projekt, das Ressourcen verliert

Jeder Weg, um das zu lösen? (Das erwartete Ergebnis sollte dasselbe sein wie die manuelle Build-Funktion für die Projektdatei in Visual Studio 2015). Vielen Dank!

var workspace = MSBuildWorkspace.Create(); 
//Locating project file that is WindowsApplication 
var project = workspace.OpenProjectAsync(@"C:\RoslynTestProjectExe\RoslynTestProjectExe.csproj").Result; 
var metadataReferences = project.MetadataReferences; 

// removing all references 
foreach (var reference in metadataReferences) 
{ 
    project = project.RemoveMetadataReference(reference); 
} 

//getting new path of dlls location and adding them to project 
var param = CreateParamString(); //my own function that returns list of references 
foreach (var par in param) 
{ 
    project = project.AddMetadataReference(MetadataReference.CreateFromFile(par)); 
} 

//compiling 
var projectCompilation = project.GetCompilationAsync().Result; 
using (var stream = new MemoryStream()) 
{ 
    var result = projectCompilation.Emit(stream); 
    if (result.Success) 
    { 
    /// Getting result 

    //writing exe file 
    using (var file = File.Create(Path.Combine(_buildPath, fileName))) 
    { 
     stream.Seek(0, SeekOrigin.Begin); 
     stream.CopyTo(file); 
    } 
    } 
} 
+0

Sie können sie manuell nach dem Kompilieren einbetten, wenn Sie etwas mehr Arbeit haben. Weitere Informationen finden Sie unter: https://github.com/dotnet/roslyn/issues/7791 – JoshVarty

Antwort

2

Wir nie wirklich die Workspace-API entwickelt, um alle Informationen, die Sie so emittieren müssen aufzunehmen; Insbesondere wenn Sie Emit aufrufen, gibt es EmitOptions, die Sie weitergeben können und die unter anderem Ressourceninformationen enthalten. Aber wir stellen diese Informationen nicht zur Verfügung, da dieses Szenario nicht besonders berücksichtigt wurde. Wir haben done some of the work in the past to enable this aber letztlich nie zusammengeführt. Vielleicht möchten Sie einen Fehler melden, damit wir die Anfrage offiziell haben.

Was können Sie also tun? Ich denke, es gibt ein paar Optionen. Sie könnte in Erwägung ziehen, Roslyn überhaupt nicht zu verwenden, sondern die Projektdatei zu ändern und das mit den MSBuild-APIs zu erstellen. Leider weiß ich nicht, was Sie hier letztendlich erreichen wollen (es würde helfen, wenn Sie es erwähnen würden), aber es gibt viel mehr als nur den Aufruf des Compilers, der an der Erstellung eines Projekts beteiligt ist. Das Ändern von Referenzen ändert möglicherweise auch andere Dinge.

Es wäre natürlich auch möglich, MSBuildWorkspace selbst zu aktualisieren. Wenn Sie den Roslyn-Code ändern, sehen Sie uns implement a series of interfaces named "ICscHostObject#" (where # is a number) and we get passed the information from MSBuild to that. Es sieht so aus, als würden wir das bereits in den Befehlszeilenargumenten speichern, so dass Sie es möglicherweise an unseren Befehlszeilenparser übergeben können und die Daten zurückbekommen, die Sie auf diese Weise benötigen.

+0

Vielen Dank für Ihre Informationen! – Bondjara

Verwandte Themen