/// <summary> /// Returns the debug view constructor for objects implementing <see cref="IDynamicMetaObjectProvider"/> /// or COM objects. /// /// The debug view is in the <c>Microsoft.CSharp</c> assembly. If it's not been loaded, this method /// returns null. /// </summary> /// <param name="appDomain">AppDomain</param> /// <returns></returns> public static DmdConstructorInfo?GetDynamicMetaObjectProviderDebugViewConstructor(DmdAppDomain appDomain) { var state = appDomain.GetOrCreateData <CtorState>(); if (state.Assembly is null) { state.Assembly = appDomain.GetAssembly(debugViewAssemblyName); var type = state.Assembly?.GetType("Microsoft.CSharp.RuntimeBinder.DynamicMetaObjectProviderDebugView", DmdGetTypeOptions.None); state.Constructor = type?.GetMethod(DmdConstructorInfo.ConstructorName, DmdSignatureCallingConvention.HasThis, 0, appDomain.System_Void, new[] { appDomain.System_Object }, throwOnError: false) as DmdConstructorInfo; } return(state.Constructor); }
protected override string InitializeCore(DbgEvaluationInfo evalInfo) { if ((evalOptions & DbgValueNodeEvaluationOptions.NoFuncEval) != 0) { return(PredefinedEvaluationErrorMessages.FuncEvalDisabled); } var proxyCtor = DynamicMetaObjectProviderDebugViewHelper.GetDynamicMetaObjectProviderDebugViewConstructor(appDomain); if ((object)proxyCtor == null) { var loadState = appDomain.GetOrCreateData <ForceLoadAssemblyState>(); if (Interlocked.Exchange(ref loadState.Counter, 1) == 0) { var loader = new ReflectionAssemblyLoader(evalInfo, appDomain); if (loader.TryLoadAssembly(GetRequiredAssemblyFullName(evalInfo.Runtime))) { proxyCtor = DynamicMetaObjectProviderDebugViewHelper.GetDynamicMetaObjectProviderDebugViewConstructor(appDomain); } } if ((object)proxyCtor == null) { var asmFilename = GetRequiredAssemblyFilename(evalInfo.Runtime); var asm = appDomain.GetAssembly(Path.GetFileNameWithoutExtension(asmFilename)); if (asm == null) { return(string.Format(dnSpy_Roslyn_Resources.DynamicViewAssemblyNotLoaded, asmFilename)); } return(string.Format(dnSpy_Roslyn_Resources.TypeDoesNotExistInAssembly, DynamicMetaObjectProviderDebugViewHelper.GetDebugViewTypeDisplayName(), asmFilename)); } } var runtime = evalInfo.Runtime.GetDotNetRuntime(); var proxyTypeResult = runtime.CreateInstance(evalInfo, proxyCtor, new[] { instanceValue }, DbgDotNetInvokeOptions.None); if (proxyTypeResult.HasError) { return(proxyTypeResult.ErrorMessage); } dynamicViewProxyExpression = valueNodeProviderFactory.GetNewObjectExpression(proxyCtor, valueExpression, expectedType); getDynamicViewValue = proxyTypeResult.Value; valueNodeProviderFactory.GetMemberCollections(getDynamicViewValue.Type, evalOptions, out membersCollection, out _); return(null); }
public DbgMonoDebugInternalAppDomainImpl(DmdAppDomain reflectionAppDomain, AppDomainMirror monoAppDomain) { ReflectionAppDomain = reflectionAppDomain ?? throw new ArgumentNullException(nameof(reflectionAppDomain)); reflectionAppDomain.GetOrCreateData(() => monoAppDomain); }
static TypeCache GetOrCreateTypeCacheCore(DmdAppDomain reflectionAppDomain2) => reflectionAppDomain2.GetOrCreateData(() => new TypeCache());