Generování a kompilace zdrojového kódu z grafu modelu CodeDOM
Obor System.CodeDom.Compiler názvů poskytuje rozhraní pro generování zdrojového kódu z grafů objektů CodeDOM a pro správu kompilace s podporovanými kompilátory. Zprostředkovatel kódu může vytvořit zdrojový kód v konkrétním programovacím jazyce podle grafu CodeDOM. Třída odvozená z CodeDomProvider může obvykle poskytovat metody pro generování a kompilaci kódu pro jazyk, který zprostředkovatel podporuje.
Použití zprostředkovatele kódu CodeDOM k vygenerování zdrojového kódu
K vygenerování zdrojového kódu v určitém jazyce potřebujete graf CodeDOM, který představuje strukturu zdrojového kódu, která se má vygenerovat.
Následující příklad ukazuje, jak vytvořit instanci CSharpCodeProvider:
CSharpCodeProvider^ provider = gcnew CSharpCodeProvider();
CSharpCodeProvider provider = new CSharpCodeProvider();
Dim provider As New CSharpCodeProvider()
Graf pro generování kódu je obvykle obsažen v objektu CodeCompileUnit. Pokud chcete vygenerovat kód pro CodeDOM graf, zavolejte metodu GenerateCodeFromCompileUnit zprostředkovatele kódu. Tato metoda má parametr, TextWriter který používá k vygenerování zdrojového kódu, takže je někdy nutné nejprve vytvořit, TextWriter
do kterého lze zapisovat. Následující příklad ukazuje generování kódu z CodeCompileUnit
a zápis vygenerovaného zdrojového kódu do souboru s názvem HelloWorld.cs.
public:
static String^ GenerateCSharpCode(CodeCompileUnit^ compileunit)
{
// Generate the code with the C# code provider.
CSharpCodeProvider^ provider = gcnew CSharpCodeProvider();
// Build the output file name.
String^ sourceFile;
if (provider->FileExtension[0] == '.')
{
sourceFile = "HelloWorld" + provider->FileExtension;
}
else
{
sourceFile = "HelloWorld." + provider->FileExtension;
}
// Create a TextWriter to a StreamWriter to the output file.
StreamWriter^ sw = gcnew StreamWriter(sourceFile, false);
IndentedTextWriter^ tw = gcnew IndentedTextWriter(sw, " ");
// Generate source code using namespace the code provider.
provider->GenerateCodeFromCompileUnit(compileunit, tw,
gcnew CodeGeneratorOptions());
// Close the output file.
tw->Close();
sw->Close();
return sourceFile;
}
public static string GenerateCSharpCode(CodeCompileUnit compileunit)
{
// Generate the code with the C# code provider.
CSharpCodeProvider provider = new CSharpCodeProvider();
// Build the output file name.
string sourceFile;
if (provider.FileExtension[0] == '.')
{
sourceFile = "HelloWorld" + provider.FileExtension;
}
else
{
sourceFile = "HelloWorld." + provider.FileExtension;
}
// Create a TextWriter to a StreamWriter to the output file.
using (StreamWriter sw = new StreamWriter(sourceFile, false))
{
IndentedTextWriter tw = new IndentedTextWriter(sw, " ");
// Generate source code using the code provider.
provider.GenerateCodeFromCompileUnit(compileunit, tw,
new CodeGeneratorOptions());
// Close the output file.
tw.Close();
}
return sourceFile;
}
Public Shared Function GenerateCSharpCode(compileunit As CodeCompileUnit) As String
' Generate the code with the C# code provider.
Dim provider As New CSharpCodeProvider()
' Build the output file name.
Dim sourceFile As String
If provider.FileExtension(0) = "." Then
sourceFile = "HelloWorld" + provider.FileExtension
Else
sourceFile = "HelloWorld." + provider.FileExtension
End If
' Create a TextWriter to a StreamWriter to the output file.
Using sw As New StreamWriter(sourceFile, false)
Dim tw As New IndentedTextWriter(sw, " ")
' Generate source code Imports the code provider.
provider.GenerateCodeFromCompileUnit(compileunit, tw, _
New CodeGeneratorOptions())
' Close the output file.
tw.Close()
End Using
Return sourceFile
End Function
Sestavení kompilujte pomocí zprostředkovatele kódu CodeDOM.
Vyvolání kompilace
Chcete-li zkompilovat sestavení pomocí zprostředkovatele CodeDom, musíte mít zdrojový kód ke kompilaci v jazyce, pro který máte kompilátor, nebo graf CodeDOM, ze kterého se dá zdrojový kód zkompilovat.
Pokud kompilujete z grafu CodeDOM, předejte CodeCompileUnit obsah grafu CompileAssemblyFromDom metodě zprostředkovatele kódu. Pokud máte soubor zdrojového kódu v jazyce, kterému kompilátor rozumí, předejte název souboru obsahujícího zdrojový kód CompileAssemblyFromFile metodě zprostředkovatele CodeDom. Můžete také předat řetězec obsahující zdrojový kód napsaný v jazyce, kterému kompilátor rozumí, metodě CompileAssemblyFromSource poskytovatele CodeDom.
Konfigurace parametrů kompilace
Všechny standardní metody volání kompilace zprostředkovatele CodeDom mají parametr typu CompilerParameters , který označuje možnosti použití pro kompilaci.
Název souboru pro výstupní sestavení můžete zadat ve OutputAssembly vlastnosti objektu CompilerParameters
. Jinak se použije výchozí název výstupního souboru.
Ve výchozím nastavení je nový CompilerParameters
inicializován s jeho GenerateExecutable vlastností nastavena na false
. Pokud kompilujete spustitelný program, musíte vlastnost nastavit GenerateExecutable
na true
. Pokud je nastavena na GenerateExecutable
false
, kompilátor vygeneruje knihovnu tříd.
Pokud kompilujete spustitelný soubor z grafu CodeDOM, CodeEntryPointMethod musí se v grafu definovat. Pokud existuje více vstupních bodů kódu, může být nutné nastavit MainClass vlastnost CompilerParameters
na název třídy, která definuje vstupní bod, který se má použít.
Chcete-li zahrnout ladicí informace do generovaného spustitelného souboru, nastavte IncludeDebugInformation vlastnost na true
.
Pokud váš projekt odkazuje na jakékoli sestavení, je nutné zadat názvy sestavení jako položky a jako ReferencedAssemblies vlastnost CompilerParameters
, kterou použijete při vyvolání kompilace.
Sestavení, které je zapsáno do paměti, lze kompilovat místo disku nastavením GenerateInMemory vlastnosti na true
. Při generování sestavení v paměti může váš kód získat odkaz na vygenerované sestavení z vlastnosti CompiledAssemblyCompilerResults. Pokud je sestavení zapsáno na disk, můžete získat cestu k vygenerovanému sestavení z PathToAssembly vlastnosti CompilerResults
.
Pokud chcete zadat vlastní řetězec argumentů příkazového řádku, který se má použít při vyvolání procesu kompilace, nastavte řetězec ve CompilerOptions vlastnosti.
Pokud se k vyvolání procesu kompilátoru vyžaduje token zabezpečení Win32, zadejte token ve UserToken vlastnosti.
Chcete-li propojit soubor prostředků Win32 s kompilovaným sestavením, zadejte název souboru prostředků Win32 ve Win32Resource vlastnosti.
Chcete-li zadat úroveň upozornění, na které se má zastavit kompilace, nastavte WarningLevel vlastnost na celé číslo, které představuje úroveň upozornění, na které se má zastavit kompilace. Kompilátor můžete také nakonfigurovat tak, aby zastavil kompilaci, pokud se objeví upozornění, tím že nastavíte TreatWarningsAsErrors vlastnost na hodnotu true
.
Následující příklad kódu ukazuje kompilaci zdrojového souboru pomocí zprostředkovatele CodeDom odvozeného z CodeDomProvider třídy.
public:
static bool CompileCSharpCode(String^ sourceFile, String^ exeFile)
{
CSharpCodeProvider^ provider = gcnew CSharpCodeProvider();
// Build the parameters for source compilation.
CompilerParameters^ cp = gcnew CompilerParameters();
// Add an assembly reference.
cp->ReferencedAssemblies->Add( "System.dll" );
// Generate an executable instead of
// a class library.
cp->GenerateExecutable = true;
// Set the assembly file name to generate.
cp->OutputAssembly = exeFile;
// Save the assembly as a physical file.
cp->GenerateInMemory = false;
// Invoke compilation.
CompilerResults^ cr = provider->CompileAssemblyFromFile(cp, sourceFile);
if (cr->Errors->Count > 0)
{
// Display compilation errors.
Console::WriteLine("Errors building {0} into {1}",
sourceFile, cr->PathToAssembly);
for each (CompilerError^ ce in cr->Errors)
{
Console::WriteLine(" {0}", ce->ToString());
Console::WriteLine();
}
}
else
{
Console::WriteLine("Source {0} built into {1} successfully.",
sourceFile, cr->PathToAssembly);
}
// Return the results of compilation.
if (cr->Errors->Count > 0)
{
return false;
}
else
{
return true;
}
}
public static bool CompileCSharpCode(string sourceFile, string exeFile)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
// Build the parameters for source compilation.
CompilerParameters cp = new CompilerParameters();
// Add an assembly reference.
cp.ReferencedAssemblies.Add( "System.dll" );
// Generate an executable instead of
// a class library.
cp.GenerateExecutable = true;
// Set the assembly file name to generate.
cp.OutputAssembly = exeFile;
// Save the assembly as a physical file.
cp.GenerateInMemory = false;
// Invoke compilation.
CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile);
if (cr.Errors.Count > 0)
{
// Display compilation errors.
Console.WriteLine($"Errors building {sourceFile} into {cr.PathToAssembly}");
foreach (CompilerError ce in cr.Errors)
{
Console.WriteLine($" {ce.ToString()}");
Console.WriteLine();
}
}
else
{
Console.WriteLine($"Source {sourceFile} built into {cr.PathToAssembly} successfully.");
}
// Return the results of compilation.
if (cr.Errors.Count > 0)
{
return false;
}
else
{
return true;
}
}
Public Shared Function CompileCSharpCode(sourceFile As String, _
exeFile As String) As Boolean
Dim provider As New CSharpCodeProvider()
' Build the parameters for source compilation.
Dim cp As New CompilerParameters()
' Add an assembly reference.
cp.ReferencedAssemblies.Add("System.dll")
' Generate an executable instead of
' a class library.
cp.GenerateExecutable = true
' Set the assembly file name to generate.
cp.OutputAssembly = exeFile
' Save the assembly as a physical file.
cp.GenerateInMemory = false
' Invoke compilation.
Dim cr As CompilerResults = provider.CompileAssemblyFromFile(cp, sourceFile)
If cr.Errors.Count > 0 Then
' Display compilation errors.
Console.WriteLine("Errors building {0} into {1}", _
sourceFile, cr.PathToAssembly)
For Each ce As CompilerError In cr.Errors
Console.WriteLine(" {0}", ce.ToString())
Console.WriteLine()
Next ce
Else
Console.WriteLine("Source {0} built into {1} successfully.", _
sourceFile, cr.PathToAssembly)
End If
' Return the results of compilation.
If cr.Errors.Count > 0 Then
Return False
Else
Return True
End If
End Function
Jazyky s počáteční podporou
.NET poskytuje kompilátory kódu a generátory kódu pro následující jazyky: C#, Visual Basic, C++ a JScript. Podporu CodeDOM je možné rozšířit do jiných jazyků implementací generátorů kódu a kompilátorů kódu specifických pro jazyk.