Comment vérifier les erreurs de compilation avant de compiler avec CodeDom
-
27-10-2019 - |
Question
J'utilise le CodeDom pour permettre des scripts personnalisés (C #) à exécuter dans une application que je crée. Tout en écrivant le script que je voudrais être en mesure de vérifier les erreurs de compilation. Le code est ajouté à et compilé en mémoire à un rythme beaucoup plus tard et donc je ne courir veux pas l'assembly compilé en écrivant le script pour rester en mémoire.
Quelle est la meilleure façon d'y parvenir?
Est-il possible de retirer l'ensemble de la mémoire après la compilation?
private void Item_Click(object sender, EventArgs e)
{
List<string> assemblyNames = new List<string> { };
List<string> code = new List<string> { };
foreach (string str in GetCompileParameters())
if (!assemblyNames.Contains(str))
assemblyNames.Add(str);
code.AddRange(GetScriptCode());
CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
CompilerParameters mCompileParams = new CompilerParameters(assemblyNames.ToArray());
mCompileParams.GenerateInMemory = true;
mCompileParams.CompilerOptions = "/target:library /optimize";
CompilerResults results = provider.CompileAssemblyFromSource(mCompileParams, code.ToArray());
if (results.Errors.HasErrors)
{
string error = "The following compile error occured:\r\n";
foreach (CompilerError err in results.Errors)
error += "File: " + err.FileName + "; Line (" + err.Line + ") - " + err.ErrorText + "\n";
MessageBox.Show(error);
return;
}
MessageBox.Show("No errors found");
//Need to Remove assembly here
}
Mise à jour:
Merci Keith.
Pour toute personne intéressée c'est le nouveau code j'utilise avec Roslyn
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;
...
private void Item_Click(object sender, EventArgs e)
{
List<string> assemblyNames = new List<string> { };
foreach (string str in GetCompileParameters())
if (!assemblyNames.Contains(str))
assemblyNames.Add(str);
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(mScenario.GetScriptCode("ScriptName"));
Compilation com = Compilation.Create("Script");
com = com.AddReferences(new AssemblyFileReference(typeof(Object).Assembly.Location)); // Add reference mscorlib.dll
com = com.AddReferences(new AssemblyFileReference(typeof(System.Linq.Enumerable).Assembly.Location)); // Add reference System.Core.dll
com = com.AddReferences(new AssemblyFileReference(typeof(System.Net.Cookie).Assembly.Location)); // Add reference System.dll
foreach (string str in assemblyNames)
com = com.AddReferences(new AssemblyFileReference(str)); // Add additional references
com = com.AddSyntaxTrees(tree);
Diagnostic[] dg = com.GetDiagnostics().ToArray();
if (dg.Length > 0)
{
string error = "The following compile error occured:\r\n";
foreach (Diagnostic d in dg)
error += "Info: " + d.Info + "\n";
MessageBox.Show(error, "Compile Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
} else {
MessageBox.Show("No errors found.", "Code Compiler", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
La solution
vous pouvez utiliser la nouvelle version http://msdn.microsoft.com/en-us/ roslyn
Autres conseils
Pour un exemple de la façon de le faire avec le Roslyn CTP, jetez un oeil à http://www.dotnetexpertguide.com/2011/10/c- syntaxe forte vérificateur-aspnet-roslyn.html