using System;
using System.Collections;
using System.IO;
+
using Mono.Cecil;
+using Mono.Cecil.Cil;
namespace Mono.Linker {
AssemblyResolver _resolver;
+ ReaderParameters _readerParameters;
+ ISymbolReaderProvider _symbolReaderProvider;
+ ISymbolWriterProvider _symbolWriterProvider;
+
AnnotationStore _annotations;
public Pipeline Pipeline {
get { return _resolver; }
}
+ public ISymbolReaderProvider SymbolReaderProvider {
+ get { return _symbolReaderProvider; }
+ set { _symbolReaderProvider = value; }
+ }
+
+ public ISymbolWriterProvider SymbolWriterProvider {
+ get { return _symbolWriterProvider; }
+ set { _symbolWriterProvider = value; }
+ }
+
public LinkContext (Pipeline pipeline)
: this (pipeline, new AssemblyResolver ())
{
_actions = new Hashtable ();
_parameters = new Hashtable ();
_annotations = new AnnotationStore ();
+ _readerParameters = new ReaderParameters {
+ AssemblyResolver = _resolver,
+ };
}
public TypeDefinition GetType (string fullName)
public AssemblyDefinition Resolve (string name)
{
if (File.Exists (name)) {
- AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly (name);
+ AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly (name, _readerParameters);
_resolver.CacheAssembly (assembly);
- SafeLoadSymbols (assembly);
return assembly;
}
public AssemblyDefinition Resolve (IMetadataScope scope)
{
AssemblyNameReference reference = GetReference (scope);
+ try {
+ AssemblyDefinition assembly = _resolver.Resolve (reference, _readerParameters);
- AssemblyDefinition assembly = _resolver.Resolve (reference);
+ if (SeenFirstTime (assembly)) {
+ SafeReadSymbols (assembly);
+ SetAction (assembly);
+ }
- if (SeenFirstTime (assembly)) {
- SetAction (assembly);
- SafeLoadSymbols (assembly);
+ return assembly;
}
+ catch {
+ throw new AssemblyResolutionException (reference);
+ }
+ }
- return assembly;
+ bool SeenFirstTime (AssemblyDefinition assembly)
+ {
+ return !_annotations.HasAction (assembly);
}
- public void SafeLoadSymbols (AssemblyDefinition assembly)
+ public void SafeReadSymbols (AssemblyDefinition assembly)
{
if (!_linkSymbols)
return;
- try {
- // throw new NotImplementedException ();
- // assembly.MainModule.LoadSymbols ();
- } catch {
- return; // resharper loves this
- }
- }
+ if (assembly.MainModule.HasSymbols)
+ return;
- bool SeenFirstTime (AssemblyDefinition assembly)
- {
- return !_annotations.HasAction (assembly);
+ try {
+ if (_symbolReaderProvider != null) {
+ var symbolReader = _symbolReaderProvider.GetSymbolReader (
+ assembly.MainModule,
+ assembly.MainModule.FullyQualifiedName);
+
+ _annotations.AddSymbolReader (assembly, symbolReader);
+ assembly.MainModule.ReadSymbols (symbolReader);
+ } else
+ assembly.MainModule.ReadSymbols ();
+ } catch {}
}
static AssemblyNameReference GetReference (IMetadataScope scope)