/// <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);
        }
Пример #2
0
        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);
        }
Пример #3
0
 public DbgMonoDebugInternalAppDomainImpl(DmdAppDomain reflectionAppDomain, AppDomainMirror monoAppDomain)
 {
     ReflectionAppDomain = reflectionAppDomain ?? throw new ArgumentNullException(nameof(reflectionAppDomain));
     reflectionAppDomain.GetOrCreateData(() => monoAppDomain);
 }
Пример #4
0
 static TypeCache GetOrCreateTypeCacheCore(DmdAppDomain reflectionAppDomain2) =>
 reflectionAppDomain2.GetOrCreateData(() => new TypeCache());