protected override bool Process(AssemblyStitcherContext context) { try { Logging.Write("Assembly at {0}", context.AssemblyPath); bool processed = false; var directives = LoadDirectives(); var disposables = new List <IDisposable>(); ModuleWritten += delegate { foreach (var disposable in disposables) { disposable.Dispose(); } }; foreach (var reference in context.Dependencies) { var assemblyFile = new AssemblyFile(reference, context.AssemblyPath); var action = GetAction(assemblyFile, directives, context.Configuration); switch (action) { case BlobAction.Embed: Embed(context.Module, assemblyFile); processed = true; break; case BlobAction.Merge: disposables.Add(Merge(context.Module, assemblyFile)); processed = true; break; case null: if (context.Configuration == "Debug") { Logging.Write("Assembly {0} ({1}) excluded from process (no matching action at all)", GetReferenceName(reference), reference.IsPrivate ? "private" : "non-private"); } break; case BlobAction.None: if (context.Configuration == "Debug") { Logging.Write("Assembly {0} ({1}) excluded from process", GetReferenceName(reference), reference.IsPrivate ? "private" : "non-private"); } break; } } if (processed) { EmbedLoader(context.Module, context.TaskAssemblyPath); } return(processed); } catch (Exception e) { Logging.WriteError("Error while blobbing: {0}", e); } return(false); }
/// <summary> /// Loads the weaved assembly. /// </summary> /// <returns></returns> private Assembly LoadWeavedAssembly(AssemblyStitcherContext context, IAssemblyResolver assemblyResolver) { foreach (var assemblyRef in context.Module.GetAssemblyRefs()) { try { var assemblyRefName = new AssemblyName(assemblyRef.FullName); if (assemblyRefName.Name == "MrAdvice") { continue; } var referencePath = assemblyResolver.Resolve(assemblyRef, context.Module).ManifestModule.Location; var fileName = Path.GetFileName(referencePath); // right, this is dirty! if (fileName == "MrAdvice.dll" && AppDomain.CurrentDomain.GetAssemblies().Any(a => a.GetName().Name == "MrAdvice")) { continue; } var referenceBytes = File.ReadAllBytes(referencePath); Assembly.Load(referenceBytes); } catch (Exception e) { _logging.WriteWarning("Can't load {0}: {1}", assemblyRef.FullName, e.ToString()); } } var bytes = File.ReadAllBytes(context.Module.Assembly.ManifestModule.Location); return(Assembly.Load(bytes)); }
protected override bool Process(AssemblyStitcherContext context) { #if DEBUG1 var r = new Resolver(context.AssemblyResolver); var typeRef = context.Module.EntryPoint.Parameters[0].Type.Next.TryGetTypeRef(); var fullType = r.Resolve(typeRef, context.Module); #endif return(true); }
protected override bool Process(AssemblyStitcherContext context) { if (AlreadyProcessed(context)) { return(false); } #if DEBUG _logging = new MultiLogging(new DefaultLogging(Logging), new FileLogging("MrAdvice.log")); _logging.WriteDebug("Start"); #else _logging = Logging; #endif if (context.Module == null) { _logging.WriteError("Target assembly {0} could not be loaded", context.AssemblyPath); return(false); } try { // instances are created here // please also note poor man's dependency injection (which is enough for us here) var assemblyResolver = context.AssemblyResolver; var typeResolver = new TypeResolver(context.Module) { Logging = _logging, AssemblyResolver = assemblyResolver }; var typeLoader = new TypeLoader(() => LoadWeavedAssembly(context, assemblyResolver)); var aspectWeaver = new AspectWeaver { Logging = _logging, TypeResolver = typeResolver, TypeLoader = typeLoader }; BlobberHelper.Setup(); //Assembly.Load("System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes"); //Assembly.Load("System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes"); Assembly.Load("MrAdvice, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c0e7e6eab6f293d8"); return(aspectWeaver.Weave(context.Module)); } catch (Exception e) { _logging.WriteError("Internal error: {0}", e.ToString()); for (var ie = e.InnerException; ie != null; ie = ie.InnerException) { _logging.WriteError("Inner exception: {0}", e.ToString()); } } return(false); }
private bool AlreadyProcessed(AssemblyStitcherContext context) { var processFilePath = GetProcessFilePath(context); var processed = GetLastWriteDate(processFilePath) >= GetLastWriteDate(context.AssemblyPath); if (!processed) { ModuleWritten += delegate { File.WriteAllText(processFilePath, "This file is a marker for Mr.Advice to ensure the assembly wan't processed twice (in which case it would be as bad as crossing the streams)."); }; } return(processed); }
/// <summary> /// Processes the specified context. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> /// <exception cref="InvalidOperationException">Ignore.</exception> protected override bool Process(AssemblyStitcherContext context) { BlobberHelper.Setup(); #if DEBUG _logging = new MultiLogging(new DefaultLogging(Logging), new FileLogging("MrAdvice.log")); _logging.WriteDebug("Start"); #else _logging = Logging; #endif if (context.Module is null) { _logging.WriteError("Target assembly {0} could not be loaded", context.AssemblyPath); return(false); } try { // instances are created here // please also note poor man's dependency injection (which is enough for us here) var assemblyResolver = context.AssemblyResolver; var typeResolver = new TypeResolver(context.Module) { Logging = _logging, AssemblyResolver = assemblyResolver }; var typeLoader = new TypeLoader(() => LoadWeavedAssembly(context, assemblyResolver)); var aspectWeaver = new AspectWeaver { Logging = _logging, TypeResolver = typeResolver, TypeLoader = typeLoader }; // second chance: someone had the marker file missing if (aspectWeaver.FindShortcutType(context.Module) is not null) { return(false); } return(aspectWeaver.Weave(context.Module)); } catch (Exception e) { _logging.WriteError("Internal error: {0}", e.ToString()); for (var ie = e.InnerException; ie is not null; ie = ie.InnerException) { _logging.WriteError("Inner exception: {0}", e.ToString()); } } return(false); }
/// <summary> /// Processes the specified module. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> protected override bool Process(AssemblyStitcherContext context) { try { var information = InformationProvider.GetInformation(context.Module.Location); var versions = LoadVersions(context.Module).ToArray(); var update = ProcessStrings(context.Module, versions, s => ProcessVersionString(s, information)) .OrAny(ProcessCustomVersion(context.Module, versions, context.BuildTime)); if (update) { SaveVersions(context.Module, versions); } return(update); } catch (OperationCanceledException) { } return(false); }
protected override bool Process(AssemblyStitcherContext context) { foreach (var type in context.Module.Types) { foreach (var methodDef in type.Methods) { foreach (var instruction in methodDef.Body.Instructions) { if (instruction.Operand is string s) { instruction.Operand = s + " I was here"; } } } } return(true); }
protected override bool Process(AssemblyStitcherContext context) { if (AlreadyProcessed(context)) { return(false); } #if DEBUG _logging = new MultiLogging(new DefaultLogging(Logging), new FileLogging("MrAdvice.log")); _logging.WriteDebug("Start"); #else _logging = Logging; #endif try { // instances are created here // please also note poor man's dependency injection (which is enough for us here) var assemblyResolver = context.AssemblyResolver; var typeResolver = new TypeResolver { Logging = _logging, AssemblyResolver = assemblyResolver }; var typeLoader = new TypeLoader(() => LoadWeavedAssembly(context, assemblyResolver)); var aspectWeaver = new AspectWeaver { Logging = _logging, TypeResolver = typeResolver, TypeLoader = typeLoader }; // TODO: use blobber's resolution (WTF?) AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; BlobberHelper.Setup(); return(aspectWeaver.Weave(context.Module)); } catch (Exception e) { _logging.WriteError("Internal error: {0}", e.ToString()); for (var ie = e.InnerException; ie != null; ie = ie.InnerException) { _logging.WriteError("Inner exception: {0}", e.ToString()); } } return(false); }
protected override bool Process(AssemblyStitcherContext context) { #if DEBUG1 var r = new Resolver(context.AssemblyResolver); var typeRef = context.Module.EntryPoint.Parameters[0].Type.Next.TryGetTypeRef(); var fullType = r.Resolve(typeRef, context.Module); #endif foreach (var type in context.Module.Types) { foreach (var methodDef in type.Methods) { foreach (var instruction in methodDef.Body.Instructions) { if (instruction.Operand is string s) { instruction.Operand = s + " I was here"; } } } } return(true); }
private static string GetProcessFilePath(AssemblyStitcherContext context) { return(context.AssemblyPath + ".\u2665MrAdvice"); }
protected override bool Process(AssemblyStitcherContext context) { BlobberHelper.Setup(); if (AlreadyProcessed(context)) { return(false); } #if DEBUG _logging = new MultiLogging(new DefaultLogging(Logging), new FileLogging("MrAdvice.log")); _logging.WriteDebug("Start"); #else _logging = Logging; #endif if (context.Module == null) { _logging.WriteError("Target assembly {0} could not be loaded", context.AssemblyPath); return(false); } try { try { const string mrAdviceAssemblyName = "MrAdvice, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c0e7e6eab6f293d8"; var mrAdviceAssembly = LoadEmbeddedAssembly(mrAdviceAssemblyName); if (mrAdviceAssembly == null) { _logging.WriteError("Can't find/load embedded MrAdvice assembly (WTF?), exiting"); return(false); } } catch (FileNotFoundException) { _logging.WriteError("Can't load MrAdvice assembly (WTF?), exiting"); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { _logging.Write("Assembly in AppDomain: {0}", assembly.GetName()); } return(false); } // instances are created here // please also note poor man's dependency injection (which is enough for us here) var assemblyResolver = context.AssemblyResolver; var typeResolver = new TypeResolver(context.Module) { Logging = _logging, AssemblyResolver = assemblyResolver }; var typeLoader = new TypeLoader(() => LoadWeavedAssembly(context, assemblyResolver)); var aspectWeaver = new AspectWeaver { Logging = _logging, TypeResolver = typeResolver, TypeLoader = typeLoader }; // second chance: someone had the marker file missing if (aspectWeaver.FindShortcutType(context.Module) != null) { return(false); } return(aspectWeaver.Weave(context.Module)); } catch (Exception e) { _logging.WriteError("Internal error: {0}", e.ToString()); for (var ie = e.InnerException; ie != null; ie = ie.InnerException) { _logging.WriteError("Inner exception: {0}", e.ToString()); } } return(false); }