Ejemplo n.º 1
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.º 2
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.º 3
0
        public void AddInitializer(Action <object> initializer, bool once)
        {
            bool error      = false;
            var  methodInfo = initializer.Method;

            if (!methodInfo.IsStatic)
            {
                _logging.WriteError("The method {0}.{1} must be static", methodInfo.DeclaringType.FullName, methodInfo.Name);
                error = true;
            }
            if (!methodInfo.IsPublic)
            {
                _logging.WriteError("The method {0}.{1} must be public", methodInfo.DeclaringType.FullName, methodInfo.Name);
                error = true;
            }
            if (error)
            {
                return;
            }

            var methodReference = _typeDefinition.Module.SafeImport(methodInfo);

            foreach (var ctor in _typeDefinition.FindConstructors().ToArray())
            {
                // the initializer is never inserted in cctor
                if (ctor.IsStaticConstructor)
                {
                    continue;
                }

                if (once && ctor.Body.Instructions.Any(i => i.OpCode == OpCodes.Call && methodReference.SafeEquivalent(i.Operand as IMethod, true)))
                {
                    continue;
                }

                var instructions = new Instructions(ctor.Body.Instructions, _typeDefinition.Module);
                // last instruction is a RET, so move just before it
                instructions.Cursor = instructions.Count - 1;
                instructions.Emit(OpCodes.Ldarg_0);
                instructions.Emit(OpCodes.Call, methodReference);
            }
        }
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
            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);
        }
 /// <summary>
 /// Tries the load the referenced assembly.
 /// </summary>
 /// <param name="assemblyResolver">The assembly resolver.</param>
 /// <param name="assemblyNameReference">The assembly name reference.</param>
 /// <param name="source">The source.</param>
 /// <param name="logging">The logging.</param>
 /// <param name="directReference">if set to <c>true</c> [direct reference].</param>
 /// <returns></returns>
 private static AssemblyDef TryLoad(IAssemblyResolver assemblyResolver, AssemblyRef assemblyNameReference, ModuleDef source, ILogging logging, bool directReference)
 {
     try
     {
         logging.WriteDebug("TryLoad '{0}' from '{1}'", assemblyNameReference.FullName, source.FullName);
         var assemblyDef = assemblyResolver.Resolve(assemblyNameReference, source);
         if (assemblyDef == null && directReference)
         {
             logging.WriteWarning("Can't load '{0}'", assemblyNameReference.FullName);
         }
         return(assemblyDef);
     }
     catch (FileNotFoundException)
     { }
     logging.WriteError("Failed loading '{0}'", assemblyNameReference.FullName);
     return(null);
 }
Ejemplo n.º 6
0
 public void WriteError(string format, params object[] parameters) => _logging.WriteError(format, parameters);
Ejemplo n.º 7
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);
        }