Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
 /// <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);
 }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
 private static string GetProcessFilePath(AssemblyStitcherContext context)
 {
     return(context.AssemblyPath + ".\u2665MrAdvice");
 }
Ejemplo n.º 12
0
        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);
        }