diff --git a/src/AddIns/Debugger/Debugger.Core/Debugger.Core.csproj b/src/AddIns/Debugger/Debugger.Core/Debugger.Core.csproj
index 7d493a8cb6..02de112c08 100644
--- a/src/AddIns/Debugger/Debugger.Core/Debugger.Core.csproj
+++ b/src/AddIns/Debugger/Debugger.Core/Debugger.Core.csproj
@@ -36,8 +36,9 @@
true
false
true
- v4.0
- Client
+ v4.5
+
+
true
diff --git a/src/AddIns/Debugger/Debugger.Core/Module.cs b/src/AddIns/Debugger/Debugger.Core/Module.cs
index f14bfa59da..5ccb0dcdc3 100644
--- a/src/AddIns/Debugger/Debugger.Core/Module.cs
+++ b/src/AddIns/Debugger/Debugger.Core/Module.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
+using System.Threading.Tasks;
using Debugger.Interop;
using Debugger.Interop.CorDebug;
using Debugger.Interop.CorSym;
@@ -27,15 +28,15 @@ namespace Debugger
ISymUnmanagedReader symReader;
MetaDataImport metaData;
- IUnresolvedAssembly unresolvedAssembly;
+ Task unresolvedAssembly;
internal Dictionary LoadedDebugTypes = new Dictionary();
public IUnresolvedAssembly UnresolvedAssembly {
- get { return unresolvedAssembly; }
+ get { return unresolvedAssembly.Result; }
}
public IAssembly Assembly {
- get { return unresolvedAssembly.Resolve(appDomain.Compilation.TypeResolveContext); }
+ get { return this.UnresolvedAssembly.Resolve(appDomain.Compilation.TypeResolveContext); }
}
public AppDomain AppDomain {
@@ -194,7 +195,7 @@ namespace Debugger
this.process = appDomain.Process;
this.corModule = corModule;
- unresolvedAssembly = TypeSystemExtensions.LoadModule(this, corModule);
+ unresolvedAssembly = TypeSystemExtensions.LoadModuleAsync(this, corModule);
metaData = new MetaDataImport(corModule);
if (IsDynamic || IsInMemory) {
diff --git a/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs b/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs
index 6b1835c001..5b918ea900 100644
--- a/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs
+++ b/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs
@@ -4,12 +4,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Reflection;
using System.Runtime.CompilerServices;
+using System.Threading.Tasks;
+
using Debugger.Interop.CorDebug;
using Debugger.MetaData;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
-using Mono.Cecil;
using Mono.Cecil.Metadata;
namespace Debugger
@@ -33,21 +35,24 @@ namespace Debugger
}
}
- internal static IUnresolvedAssembly LoadModule(Module module, ICorDebugModule corModule)
+ internal static Task LoadModuleAsync(Module module, ICorDebugModule corModule)
{
string name = corModule.GetName();
if (corModule.IsDynamic() == 1 || corModule.IsInMemory() == 1)
- return new DefaultUnresolvedAssembly(name);
- CecilLoader loader = new CecilLoader(true);
- loader.IncludeInternalMembers = true;
- var asm = loader.LoadAssemblyFile(name);
- var moduleMetadataInfo = new ModuleMetadataInfo(module);
- foreach (var typeDef in asm.GetAllTypeDefinitions()) {
- var cecilTypeDef = loader.GetCecilObject(typeDef);
- moduleMetadataInfo.MetadataTokens[typeDef] = cecilTypeDef.MetadataToken.ToUInt32();
- }
- weakTable.Add(asm, moduleMetadataInfo);
- return asm;
+ return Task.FromResult(new DefaultUnresolvedAssembly(name));
+ return Task.Run(
+ delegate {
+ CecilLoader loader = new CecilLoader(true);
+ loader.IncludeInternalMembers = true;
+ var asm = loader.LoadAssemblyFile(name);
+ var moduleMetadataInfo = new ModuleMetadataInfo(module);
+ foreach (var typeDef in asm.GetAllTypeDefinitions()) {
+ var cecilTypeDef = loader.GetCecilObject(typeDef);
+ moduleMetadataInfo.MetadataTokens[typeDef] = cecilTypeDef.MetadataToken.ToUInt32();
+ }
+ weakTable.Add(asm, moduleMetadataInfo);
+ return asm;
+ });
}
static ModuleMetadataInfo GetInfo(IAssembly assembly)
@@ -66,6 +71,12 @@ namespace Debugger
#region IType -> ICorDebugType
public static ICorDebugType ToCorDebug(this IType type)
+ {
+ AppDomain appDomain;
+ return ToCorDebug(type, out appDomain);
+ }
+
+ static ICorDebugType ToCorDebug(IType type, out AppDomain appDomain)
{
switch (type.Kind) {
case TypeKind.Class:
@@ -75,19 +86,33 @@ namespace Debugger
case TypeKind.Enum:
case TypeKind.Module:
case TypeKind.Void:
- return ConvertTypeDefOrParameterizedType(type);
+ return ConvertTypeDefOrParameterizedType(type, out appDomain);
case TypeKind.Array:
+ {
+ var arrayType = (ArrayType)type;
+ var elementType = ToCorDebug(arrayType.ElementType, out appDomain);
+ return appDomain.CorAppDomain2.GetArrayOrPointerType(
+ (uint)(arrayType.Dimensions == 1 ? CorElementType.SZARRAY : CorElementType.ARRAY),
+ (uint)arrayType.Dimensions, elementType);
+ }
case TypeKind.Pointer:
case TypeKind.ByReference:
- throw new NotImplementedException();
+ {
+ var pointerType = (TypeWithElementType)type;
+ var elementType = ToCorDebug(pointerType.ElementType, out appDomain);
+ return appDomain.CorAppDomain2.GetArrayOrPointerType(
+ (uint)(type.Kind == TypeKind.Pointer ? CorElementType.PTR : CorElementType.BYREF),
+ 0, elementType);
+ }
default:
throw new System.Exception("Invalid value for TypeKind");
}
}
- static ICorDebugType ConvertTypeDefOrParameterizedType(IType type)
+ static ICorDebugType ConvertTypeDefOrParameterizedType(IType type, out AppDomain appDomain)
{
ITypeDefinition typeDef = type.GetDefinition();
+ appDomain = GetAppDomain(typeDef.Compilation);
var info = GetInfo(typeDef.ParentAssembly);
uint token = info.MetadataTokens[typeDef.Parts[0]];
ICorDebugClass corClass = info.Module.CorModule.GetClassFromToken(token);