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(); }
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(); } }
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); }
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); }
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(); }
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; }
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(); }
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; }
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(); }
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); } }