/// <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()); } }
/// <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); } } }