// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+using System;
using System.IO;
using Mono.Cecil;
+using Mono.Cecil.Cil;
namespace Mono.Linker.Steps {
protected override void Process ()
{
CheckOutputDirectory ();
+ Annotations.SaveDependencies ();
}
void CheckOutputDirectory ()
CopyConfigFileIfNeeded (assembly, directory);
switch (Annotations.GetAction (assembly)) {
+ case AssemblyAction.Save:
case AssemblyAction.Link:
- AssemblyFactory.SaveAssembly (assembly, GetAssemblyFileName (assembly, directory));
+ Context.Annotations.AddDependency (assembly);
+ assembly.Write (GetAssemblyFileName (assembly, directory), SaveSymbols (assembly));
break;
case AssemblyAction.Copy:
- CopyAssembly (GetOriginalAssemblyFileInfo (assembly), directory);
+ Context.Annotations.AddDependency (assembly);
+ CloseSymbols (assembly);
+ CopyAssembly (GetOriginalAssemblyFileInfo (assembly), directory, Context.LinkSymbols);
+ break;
+ case AssemblyAction.Delete:
+ CloseSymbols (assembly);
+ var target = GetAssemblyFileName (assembly, directory);
+ if (File.Exists (target)) {
+ File.Delete (target);
+ File.Delete (target + ".mdb");
+ File.Delete (GetConfigFile (target));
+ }
+ break;
+ default:
+ CloseSymbols (assembly);
break;
}
}
+ void CloseSymbols (AssemblyDefinition assembly)
+ {
+ Annotations.CloseSymbolReader (assembly);
+ }
+
+ WriterParameters SaveSymbols (AssemblyDefinition assembly)
+ {
+ var parameters = new WriterParameters ();
+ if (!Context.LinkSymbols)
+ return parameters;
+
+ if (!assembly.MainModule.HasSymbols)
+ return parameters;
+
+ if (Context.SymbolWriterProvider != null)
+ parameters.SymbolWriterProvider = Context.SymbolWriterProvider;
+ else
+ parameters.WriteSymbols = true;
+ return parameters;
+ }
+
static void CopyConfigFileIfNeeded (AssemblyDefinition assembly, string directory)
{
string config = GetConfigFile (GetOriginalAssemblyFileInfo (assembly).FullName);
if (!File.Exists (config))
return;
+ string target = Path.GetFullPath (GetConfigFile (GetAssemblyFileName (assembly, directory)));
+
+ if (config == target)
+ return;
+
File.Copy (config, GetConfigFile (GetAssemblyFileName (assembly, directory)), true);
}
static FileInfo GetOriginalAssemblyFileInfo (AssemblyDefinition assembly)
{
- return assembly.MainModule.Image.FileInformation;
+ return new FileInfo (assembly.MainModule.FullyQualifiedName);
}
- static void CopyAssembly (FileInfo fi, string directory)
+ static void CopyAssembly (FileInfo fi, string directory, bool symbols)
{
- File.Copy (fi.FullName, Path.Combine (directory, fi.Name), true);
+ string target = Path.GetFullPath (Path.Combine (directory, fi.Name));
+ string source = fi.FullName;
+ if (source == target)
+ return;
+
+ File.Copy (source, target, true);
+
+ if (!symbols)
+ return;
+
+ source += ".mdb";
+ if (!File.Exists (source))
+ return;
+ File.Copy (source, target + ".mdb", true);
}
static string GetAssemblyFileName (AssemblyDefinition assembly, string directory)
{
- string file = assembly.Name.Name + (assembly.Kind == AssemblyKind.Dll ? ".dll" : ".exe");
+ string file = assembly.Name.Name + (assembly.MainModule.Kind == ModuleKind.Dll ? ".dll" : ".exe");
return Path.Combine (directory, file);
}
}