protected override void ExecuteTask()
{
// ensure base directory is set, even if fileset was not initialized
// from XML
if (Resources.BaseDirectory == null) {
Resources.BaseDirectory = new DirectoryInfo(Project.BaseDirectory);
}
// ensure base directory is set, even if fileset was not initialized
// from XML
if (ModuleSet.Dir == null) {
ModuleSet.Dir = new DirectoryInfo(Project.BaseDirectory);
}
if (NeedsCompiling()) {
// create temp response file to hold compiler options
_responseFileName = Path.GetTempFileName();
StreamWriter writer = new StreamWriter(_responseFileName);
try {
Log(Level.Info, ResourceUtils.GetString("String_CompilingFiles"),
Resources.FileNames.Count + EmbeddedResources.Count +
ModuleSet.Modules.Count, OutputFile.FullName);
// write modules to compile into assembly
foreach (Module module in ModuleSet.Modules) {
writer.WriteLine("\"{0}\"", module.ToString());
}
// write output target
writer.WriteLine("/target:\"{0}\"", OutputTarget);
// write output file
writer.WriteLine("/out:\"{0}\"", OutputFile.FullName);
// algorithm (in hexadecimal)
if (AlgorithmID != null) {
writer.WriteLine("/algid:\"{0}\"", AlgorithmID);
}
// company field
if (Company != null) {
writer.WriteLine("/company:\"{0}\"", Company);
}
// configuration field
if (Configuration != null) {
writer.WriteLine("/configuration:\"{0}\"", Configuration);
}
// copyright field
if (Copyright != null) {
writer.WriteLine("/copyright:\"{0}\"", Copyright);
}
// write culture associated with output assembly
if (Culture != null) {
writer.WriteLine("/culture:\"{0}\"", Culture);
}
// delay sign the assembly
switch (DelaySign) {
case DelaySign.NotSet:
break;
case DelaySign.Yes:
writer.WriteLine("/delaysign+");
break;
case DelaySign.No:
writer.WriteLine("/delaysign-");
break;
default:
throw new BuildException (string.Format (CultureInfo.InvariantCulture,
"Value {0} is not supported for \"delaysign\".",
DelaySign), Location);
}
// description field
if (Description != null) {
writer.WriteLine("/description:\"{0}\"", Description);
}
// write path to security evidence file
if (EvidenceFile != null) {
writer.WriteLine("/evidence:\"{0}\"", EvidenceFile.FullName);
}
// file version field
if (FileVersion != null) {
writer.WriteLine("/fileversion:\"{0}\"", FileVersion);
}
// flags field
if (Flags != null) {
writer.WriteLine("/flags:\"{0}\"", Flags);
}
// main method
if (MainMethod != null) {
writer.WriteLine("/main:\"{0}\"", MainMethod);
}
// keycontainer
if (KeyContainer != null) {
writer.WriteLine("/keyname:\"{0}\"", KeyContainer);
}
// product field
if (Product != null) {
writer.WriteLine("/product:\"{0}\"", Product);
}
// product version field
if (ProductVersion != null) {
writer.WriteLine("/productversion:\"{0}\"", ProductVersion);
}
// write path to template assembly
if (TemplateFile != null) {
if (SupportsTemplate) {
writer.WriteLine("/template:\"{0}\"", TemplateFile.FullName);
} else {
Log(Level.Warning,
ResourceUtils.GetString("String_LinkerDoesNotSupportTemplateAssembly"),
Project.TargetFramework.Description);
}
}
// title field
if (Title != null) {
writer.WriteLine("/title:\"{0}\"", Title);
}
// trademark field
if (Trademark != null) {
writer.WriteLine("/trademark:\"{0}\"", Trademark);
}
// key file
if (KeyFile != null) {
writer.WriteLine("/keyfile:\"{0}\"", KeyFile.FullName);
}
// assembly version
if (Version != null) {
writer.WriteLine("/version:\"{0}\"", Version);
}
// win32 icon
if (Win32Icon != null) {
writer.WriteLine("/win32icon:\"{0}\"", Win32Icon.FullName);
}
// win32 resource
if (Win32Res != null) {
writer.WriteLine("/win32res:\"{0}\"", Win32Res.FullName);
}
// write embedded resources to response file
foreach (string resourceFile in Resources.FileNames) {
writer.WriteLine("/embed:\"{0}\"", resourceFile);
}
// write embedded resources to response file
foreach (EmbeddedResource embeddedResource in EmbeddedResources) {
writer.WriteLine("/embed:\"{0}\",{1}", embeddedResource.File,
embeddedResource.ManifestResourceName);
}
// suppresses display of the sign-on banner
writer.WriteLine("/nologo");
// make sure to close the response file otherwise contents
// Will not be written to disk and ExecuteTask() will fail.
writer.Close();
if (Verbose) {
// display response file contents
Log(Level.Verbose, ResourceUtils.GetString("String_ContentsOf"), _responseFileName);
StreamReader reader = File.OpenText(_responseFileName);
Log(Level.Verbose, reader.ReadToEnd());
reader.Close();
}
// call base class to do the work
base.ExecuteTask();
} finally {
// make sure stream is closed or response file cannot be deleted
writer.Close();
// make sure we delete response file even if an exception is thrown
File.Delete(_responseFileName);
// initialize name of response file
_responseFileName = null;
}
}
}