public static AssemblyLoaderInfo LoadAssemblyLoader(bool createTemporaryAssemblies, bool hasUnmanaged, ModuleDeclaration module) { AssemblyLoaderInfo info = new AssemblyLoaderInfo(); TypeDefDeclaration sourceType; if (createTemporaryAssemblies) { sourceType = module.FindType("PostSharp.Community.Packer.Templates.ILTemplateWithTempAssembly") .GetTypeDefinition(); } else if (hasUnmanaged) { sourceType = module.FindType("PostSharp.Community.Packer.Templates.ILTemplateWithUnmanagedHandler") .GetTypeDefinition(); } else { sourceType = module.FindType("PostSharp.Community.Packer.Templates.ILTemplate") .GetTypeDefinition(); } info.AttachMethod = module.FindMethod(sourceType, "Attach").GetMethodDefinition(); info.StaticConstructorMethod = module.FindMethod(sourceType, ".cctor").GetMethodDefinition(); info.AssemblyNamesField = sourceType.FindField("assemblyNames")?.Field; info.SymbolNamesField = sourceType.FindField("symbolNames")?.Field; info.PreloadListField = sourceType.FindField("preloadList")?.Field; info.Preload32ListField = sourceType.FindField("preload32List")?.Field; info.Preload64ListField = sourceType.FindField("preload64List")?.Field; info.Md5HashField = sourceType.FindField("md5Hash")?.Field; info.ChecksumsField = sourceType.FindField("checksums")?.Field; return(info); }
bool FindInitializeCalls(Project project, AssemblyLoaderInfo assemblyLoaderInfo) { INamedType packerUtilityType = (INamedType)project.Module.FindType(typeof(PackerUtility)); MethodDefDeclaration packerUtilityInitialize = project.Module.FindMethod(packerUtilityType, "Initialize").GetMethodDefinition(); Sdk.CodeWeaver.Weaver weaver = new Sdk.CodeWeaver.Weaver(project); ReplacePackerUtilityInitializeAdvice replacingAdvice = new ReplacePackerUtilityInitializeAdvice(assemblyLoaderInfo.AttachMethod); weaver.AddMethodLevelAdvice(replacingAdvice, null, JoinPointKinds.InsteadOfCall, new[] { packerUtilityInitialize }); weaver.Weave(); return(replacingAdvice.ReplacedAtLeastOneCall); }
public void SynthesizeCallToAttach(PackerAttribute config, Project project, AssemblyLoaderInfo assemblyLoaderInfo) { var initialized = FindInitializeCalls(project, assemblyLoaderInfo); if (config.LoadAtModuleInit) { AddModuleInitializerCall(project, assemblyLoaderInfo); } else if (!initialized) { Message.Write(project.Module.Assembly.GetSystemAssembly(), SeverityType.Warning, "PACK01", "The add-in was not initialized. Make sure LoadAtModuleInit=true or call PackerUtility.Initialize()."); } }
public override bool Execute() { // Find configuration: var annotations = annotationsService.GetAnnotationsOfType(typeof(PackerAttribute), false, true); PackerAttribute config = new PackerAttribute(); if (annotations.MoveNext()) { config = Configuration.Read(annotations.Current); } // Find gatherable assemblies: string[] paths = Project.Properties["ReferenceCopyLocalPaths"]?.Split('|') ?? new string[0]; AssemblyManifestDeclaration manifest = Project.Module.AssemblyManifest; // I have no idea what this is doing: ResourceCaseFixer.FixResourceCase(manifest); // Embed resources: var checksums = new Checksums(); bool unmanagedFromProcessor = NativeResourcesProcessor.ProcessNativeResources(manifest, !config.DisableCompression, checksums); var resourceEmbedder = new ResourceEmbedder(manifest); resourceEmbedder.EmbedResources(config, paths, checksums); bool unmanagedFromEmbedder = resourceEmbedder.HasUnmanaged; // Load references: var assets = new Assets(Project.Module); AssemblyLoaderInfo info = AssemblyLoaderInfo.LoadAssemblyLoader(config.CreateTemporaryAssemblies, unmanagedFromEmbedder || unmanagedFromProcessor, Project.Module); // Alter code: string resourcesHash = ResourceHash.CalculateHash(manifest); new AttachCallSynthesis().SynthesizeCallToAttach(config, Project, info); new ResourceNameFinder(info, manifest, assets).FillInStaticConstructor( config.CreateTemporaryAssemblies, config.PreloadOrder, resourcesHash, checksums); return(true); }
public ResourceNameFinder(AssemblyLoaderInfo info, AssemblyManifestDeclaration manifest, Assets assets) { this.info = info; this.manifest = manifest; this.assets = assets; }
void AddModuleInitializerCall(Project project, AssemblyLoaderInfo assemblyLoaderInfo) { var task = project.GetTask <AspectInfrastructureTask>(); task.TypeInitializationManager.RegisterClient(new CallAttachModuleInitializer(assemblyLoaderInfo.AttachMethod), TypeInitializationClientScopes.Module); }