Ejemplo n.º 1
0
    void ExecuteInOwnAppDomain()
    {
        if (WeaversHistory.HasChanged(Weavers.Select(x => x.AssemblyPath)) || appDomain == null)
        {
            if (appDomain != null)
            {
                AppDomain.Unload(appDomain);
            }

            var appDomainSetup = new AppDomainSetup
            {
                ApplicationBase = AssemblyLocation.CurrentDirectory(),
            };
            appDomain = AppDomain.CreateDomain("Fody", null, appDomainSetup);
        }
        var innerWeaver = (IInnerWeaver)appDomain.CreateInstanceAndUnwrap("FodyIsolated", "InnerWeaver");

        innerWeaver.AssemblyPath    = AssemblyPath;
        innerWeaver.References      = References;
        innerWeaver.KeyFilePath     = KeyFilePath;
        innerWeaver.Logger          = Logger;
        innerWeaver.AssemblyPath    = AssemblyPath;
        innerWeaver.Weavers         = Weavers;
        innerWeaver.IntermediateDir = IntermediateDir;
        innerWeaver.Execute();
    }
Ejemplo n.º 2
0
    void ExecuteInOwnAppDomain()
    {
        AppDomain appDomain;

        if (solutionDomains.TryGetValue(SolutionDirectoryPath, out appDomain))
        {
            if (WeaversHistory.HasChanged(Weavers.Select(x => x.AssemblyPath)))
            {
                Logger.LogInfo("A Weaver HasChanged so loading a new AppDomain");
                AppDomain.Unload(appDomain);
                appDomain = solutionDomains[SolutionDirectoryPath] = CreateDomain();
            }
        }
        else
        {
            appDomain = solutionDomains[SolutionDirectoryPath] = CreateDomain();
        }

        using (var innerWeaver = (IInnerWeaver)appDomain.CreateInstanceAndUnwrap("FodyIsolated", "InnerWeaver"))
        {
            innerWeaver.AssemblyFilePath        = AssemblyFilePath;
            innerWeaver.References              = References;
            innerWeaver.KeyFilePath             = KeyFilePath;
            innerWeaver.ReferenceCopyLocalPaths = ReferenceCopyLocalPaths;
            innerWeaver.SignAssembly            = SignAssembly;
            innerWeaver.Logger = Logger;
            innerWeaver.SolutionDirectoryPath = SolutionDirectoryPath;
            innerWeaver.Weavers = Weavers;
            innerWeaver.IntermediateDirectoryPath = IntermediateDirectoryPath;
            innerWeaver.DefineConstants           = DefineConstants;
            innerWeaver.ProjectDirectoryPath      = ProjectDirectory;

            innerWeaver.Execute();
        }
    }
Ejemplo n.º 3
0
    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var assemblyName = new AssemblyName(args.Name).Name;

        if (assemblyName == "FodyHelpers")
        {
            return(typeof(BaseModuleWeaver).Assembly);
        }

        if (assemblyName == "Mono.Cecil")
        {
            return(typeof(ModuleDefinition).Assembly);
        }

        if (assemblyName == "Mono.Cecil.Rocks")
        {
            return(typeof(MethodBodyRocks).Assembly);
        }

        if (assemblyName == "Mono.Cecil.Pdb")
        {
            return(typeof(PdbReaderProvider).Assembly);
        }

        if (assemblyName == "Mono.Cecil.Mdb")
        {
            return(typeof(MdbReaderProvider).Assembly);
        }

        foreach (var weaverPath in Weavers.Select(x => x.AssemblyPath))
        {
            var directoryName    = Path.GetDirectoryName(weaverPath);
            var assemblyFileName = $"{assemblyName}.dll";
            var assemblyPath     = Path.Combine(directoryName, assemblyFileName);
            if (!File.Exists(assemblyPath))
            {
                continue;
            }

            try
            {
                return(LoadFromFile(assemblyPath));
            }
            catch (Exception exception)
            {
                var message = $"Failed to load '{assemblyPath}'. Going to swallow and continue to let other AssemblyResolve events to attempt to resolve. Exception:{exception}";
                Logger.LogWarning(message);
            }
        }

        return(null);
    }
Ejemplo n.º 4
0
 Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
 {
     foreach (var weaverPath in Weavers.Select(x => x.AssemblyPath))
     {
         var    directoryName    = Path.GetDirectoryName(weaverPath);
         var    assemblyFileName = new AssemblyName(args.Name).Name + ".dll";
         string assemblyPath     = Path.Combine(directoryName, assemblyFileName);
         if (File.Exists(assemblyPath))
         {
             return(LoadFromFile(assemblyPath));
         }
     }
     return(null);
 }
Ejemplo n.º 5
0
    void Inner()
    {
        ValidateProjectPath();

        ValidateAssemblyPath();

        ConfigFiles = ConfigFileFinder.FindWeaverConfigs(SolutionDirectory, ProjectDirectory, Logger);

        if (!ShouldStartSinceFileChanged())
        {
            if (!CheckForWeaversXmlChanged())
            {
                FindWeavers();

                if (WeaversHistory.HasChanged(Weavers.Select(x => x.AssemblyPath)))
                {
                    Logger.LogError("A re-build is required because a weaver has changed.");
                }
            }
            return;
        }

        ValidateSolutionPath();

        FindWeavers();

        if (Weavers.Count == 0)
        {
            Logger.LogWarning(@"No configured weavers. It is possible no weavers have been installed or a weaver has been installed into a project type that does not support install.ps1. It may be necessary to manually add that weaver to FodyWeavers.xm;. eg.
<Weavers>
    <WeaverName/>
</Weavers>
see https://github.com/Fody/Fody/wiki/SampleUsage");
            return;
        }
        lock (locker)
        {
            ExecuteInOwnAssemblyLoadContext();
        }

        FlushWeaversXmlHistory();
    }
Ejemplo n.º 6
0
    void ExecuteInOwnAssemblyLoadContext()
    {
        if (solutionAssemblyLoadContexts.TryGetValue(SolutionDirectory, out var loadContext))
        {
            if (WeaversHistory.HasChanged(Weavers.Select(x => x.AssemblyPath)))
            {
                Logger.LogDebug("A Weaver HasChanged so loading a new AssemblyLoadContext");
                loadContext.Unload();
                loadContext = solutionAssemblyLoadContexts[SolutionDirectory] = CreateAssemblyLoadContext();
            }
        }
        else
        {
            loadContext = solutionAssemblyLoadContexts[SolutionDirectory] = CreateAssemblyLoadContext();
        }

        var assemblyFile = Path.Combine(AssemblyLocation.CurrentDirectory, "FodyIsolated.dll");

        using (innerWeaver = (IInnerWeaver)loadContext.CreateInstanceFromAndUnwrap(assemblyFile, "InnerWeaver"))
        {
            innerWeaver.AssemblyFilePath        = AssemblyFilePath;
            innerWeaver.References              = References;
            innerWeaver.KeyFilePath             = KeyFilePath;
            innerWeaver.ReferenceCopyLocalPaths = ReferenceCopyLocalPaths;
            innerWeaver.SignAssembly            = SignAssembly;
            innerWeaver.Logger = Logger;
            innerWeaver.SolutionDirectoryPath = SolutionDirectory;
            innerWeaver.Weavers = Weavers;
            innerWeaver.IntermediateDirectoryPath = IntermediateDirectory;
            innerWeaver.DefineConstants           = DefineConstants;
            innerWeaver.ProjectDirectoryPath      = ProjectDirectory;
            innerWeaver.DocumentationFilePath     = DocumentationFilePath;
            innerWeaver.DebugSymbols = DebugSymbols;

            innerWeaver.Execute();

            ReferenceCopyLocalPaths = innerWeaver.ReferenceCopyLocalPaths;
        }
        innerWeaver = null;
    }
Ejemplo n.º 7
0
    void Inner()
    {
        ValidateProjectPath();

        ValidateAssemblyPath();

        ConfigFiles = ConfigFileFinder.FindWeaverConfigs(SolutionDirectory, ProjectDirectory, Logger);

        if (!ShouldStartSinceFileChanged())
        {
            if (!CheckForWeaversXmlChanged())
            {
                FindWeavers();

                if (WeaversHistory.HasChanged(Weavers.Select(x => x.AssemblyPath)))
                {
                    Logger.LogError("A re-build is required because a weaver has changed.");
                }
            }
            return;
        }

        ValidateSolutionPath();

        FindWeavers();

        if (Weavers.Count == 0)
        {
            Logger.LogError("No configured weavers. It is possible you have not installed a weaver or have installed a fody weaver nuget into a project type that does not support install.ps1. You may need to add that weaver to FodyWeavers.xml manually. eg. <Weavers><WeaverName/></Weavers>. see https://github.com/Fody/Fody/wiki/SampleUsage");
            return;
        }
        lock (locker)
        {
            ExecuteInOwnAppDomain();
        }

        FlushWeaversXmlHistory();
    }
Ejemplo n.º 8
0
    void ExecuteInOwnAppDomain()
    {
        AppDomain appDomain;

        if (solutionDomains.TryGetValue(SolutionDirectory, out appDomain))
        {
            if (WeaversHistory.HasChanged(Weavers.Select(x => x.AssemblyPath)))
            {
                Logger.LogDebug("A Weaver HasChanged so loading a new AppDomain");
                AppDomain.Unload(appDomain);
                appDomain = solutionDomains[SolutionDirectory] = CreateDomain();
            }
        }
        else
        {
            appDomain = solutionDomains[SolutionDirectory] = CreateDomain();
        }

        var assemblyFile = Path.Combine(AssemblyLocation.CurrentDirectory, "FodyIsolated.dll");

        using (innerWeaver = (IInnerWeaver)appDomain.CreateInstanceFromAndUnwrap(assemblyFile, "InnerWeaver"))
        {
            innerWeaver.AssemblyFilePath        = AssemblyFilePath;
            innerWeaver.References              = References;
            innerWeaver.KeyFilePath             = KeyFilePath;
            innerWeaver.ReferenceCopyLocalPaths = ReferenceCopyLocalPaths;
            innerWeaver.SignAssembly            = SignAssembly;
            innerWeaver.Logger = Logger;
            innerWeaver.SolutionDirectoryPath = SolutionDirectory;
            innerWeaver.Weavers = Weavers;
            innerWeaver.IntermediateDirectoryPath = IntermediateDirectory;
            innerWeaver.DefineConstants           = DefineConstants;
            innerWeaver.ProjectDirectoryPath      = ProjectDirectory;

            innerWeaver.Execute();
        }
        innerWeaver = null;
    }
Ejemplo n.º 9
0
    void Inner()
    {
        ValidateProjectPath();

        ValidateAssemblyPath();

        FindProjectWeavers();

        if (!ShouldStartSinceFileChanged())
        {
            if (!CheckForWeaversXmlChanged())
            {
                FindWeavers();

                if (WeaversHistory.HasChanged(Weavers.Select(x => x.AssemblyPath)))
                {
                    Logger.LogWarning("A re-build is required to because a weaver changed");
                }
            }
            return;
        }

        ValidateSolutionPath();

        FindWeavers();

        if (Weavers.Count == 0)
        {
            Logger.LogError("You don't seem to have configured any weavers. Try adding a Fody nuget package to your project. Have a look here http://nuget.org/packages?q=fody for the list of available packages.");
            return;
        }
        lock (locker)
        {
            ExecuteInOwnAppDomain();
        }

        FlushWeaversXmlHistory();
    }
Ejemplo n.º 10
0
    void Inner()
    {
        ValidateProjectPath();

        ValidatorAssemblyPath();

        FindProjectWeavers();

        if (!ShouldStartSinceFileChanged())
        {
            if (!CheckForWeaversXmlChanged())
            {
                FindWeavers();

                if (WeaversHistory.HasChanged(Weavers.Select(x => x.AssemblyPath)))
                {
                    Logger.LogWarning("A re-build is required to because a weaver changed");
                }
            }
            return;
        }

        ValidateSolutionPath();

        FindWeavers();

        if (Weavers.Count == 0)
        {
            Logger.LogWarning(string.Format("Could not find any weavers. Either add a project named 'Weavers' with a type named 'ModuleWeaver' or add some items to '{0}'.", "FodyWeavers.xml"));
            return;
        }

        lock (locker)
        {
            ExecuteInOwnAppDomain();
        }
        FlushWeaversXmlHistory();
    }
    public void ConfigureWhenNoWeaversFound()
    {
        if (!FoundWeaverProjectFile)
        {
            return;
        }
        if (WeaverProjectUsed)
        {
            return;
        }
        var weaverProjectContainsType = WeaverProjectContainsType("ModuleWeaver");

        if (weaverProjectContainsType)
        {
            Logger.LogInfo("Found 'ModuleWeaver' in project 'Weavers' so will run that one.");
            var weaverEntry = new WeaverEntry
            {
                AssemblyPath = WeaverAssemblyPath,
                TypeName     = "ModuleWeaver"
            };
            Weavers.Add(weaverEntry);
        }
    }