Exemple #1
0
        /// <summary>
        /// Process a module, using a <see cref="IModuleWeaver"/>
        /// </summary>
        private void ProcessModuleWeaver(Type weaverType, IModuleWeaver weaver, bool before)
        {
            // If we got this far, (weaver is IModuleWeaver && weaver is WeaverAttribute) == true.
            R.PropertyInfo logProp = weaverType.GetProperty(nameof(WeaverAttribute.LogInternal), R.BindingFlags.NonPublic | R.BindingFlags.Instance);

            // Add ability to log messages
            if (LogMessageDelegate == null)
            {
                LogMessageDelegate = Delegate.CreateDelegate(logProp.PropertyType, this, nameof(Weaver.LogMessage));
            }

            logProp.SetValue(weaver, LogMessageDelegate);

            // Invoke Weaver.Apply();
            try
            {
                BeingProcessed = Module;
                weaver.Apply(Module, before ? ProcessingState.Before : ProcessingState.After);
            }
            catch (Exception e)
            {
                throw new WeavingException(e, Module, weaver.GetType());
            }

            // Clean up if this was declared in this assembly
            if (!before && ShouldCleanUp && weaverType.Assembly == Assembly)
            {
                Module.Types.Remove(weaverType.AsTypeDefinition());
            }
        }
Exemple #2
0
        /// <summary>
        /// Import default settings for every declared attribute that inherits
        /// <see cref="InsiderSettingAttribute"/>.
        /// </summary>
        private void ImportDefaultSettings(ModuleDefinition moduleDef, SR.Assembly assembly)
        {
            bool cleanUp = ShouldCleanUp;

            foreach (TypeDefinition type in moduleDef.Types)
            {
                if (Extends <InsiderSettingAttribute>(type)) // Import default settings
                {
                    foreach (IMemberDefinition member in type.Fields.OfType <IMemberDefinition>().Concat(type.Properties))
                    {
                        CustomAttribute attr = member.GetAttribute <DefaultSettingValueAttribute>();
                        if (attr == null)
                        {
                            continue;
                        }

                        string name = type.Namespace + '.' + member.Name;
                        if (!Settings.ContainsKey(name))
                        {
                            Settings[name] = attr.ConstructorArguments[0].GetValue();
                        }

                        if (cleanUp)
                        {
                            member.CustomAttributes.Remove(attr);
                        }
                    }
                }
                else if (Extends <IModuleWeaver>(type)) // Module weaver
                {
                    Type moduleWeaverType = assembly.GetType(type.FullName);
                    if (moduleWeaverType == null)
                    {
                        continue;
                    }

                    var ctor = moduleWeaverType.GetConstructor(new Type[0]);
                    if (ctor == null)
                    {
                        continue;
                    }

                    IModuleWeaver weaver = (IModuleWeaver)ctor.Invoke(new object[0]);
                    ProcessModuleWeaver(moduleWeaverType, weaver, true);

                    ModuleWeavers.Add(weaver);
                }
            }
        }