From 748a629b13a4425de6122a019d119a7d8b79f2bd Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 7 Dec 2024 17:35:43 +0100 Subject: [PATCH 1/2] Use the `AppDomainIsolatedTask` to isolate the task automatically by msbuild system --- src/CleanAddin.cs | 7 +++---- src/RegisterAddin.cs | 15 +++------------ 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/CleanAddin.cs b/src/CleanAddin.cs index 405d6ac..411b737 100644 --- a/src/CleanAddin.cs +++ b/src/CleanAddin.cs @@ -1,11 +1,12 @@ using System; using System.IO; +using System.Reflection; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; namespace NetOfficeFw.Build { - public class CleanAddin : Task + public class CleanAddin : AppDomainIsolatedTask { [Required] public ITaskItem AssemblyPath { get; set; } @@ -19,9 +20,7 @@ public override bool Execute() var assemblyPath = this.AssemblyPath.ItemSpec; var assemblyDir = Path.GetDirectoryName(assemblyPath); - AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += (sender, args) => AssemblyEx.ReflectionOnlyAssemblyResolve(args, assemblyDir); - - var assembly = AssemblyEx.ReflectionOnlyLoadAssembly(assemblyPath); + var assembly = Assembly.UnsafeLoadFrom(assemblyPath); var publicTypes = assembly.GetExportedTypes(); foreach (var publicType in publicTypes) diff --git a/src/RegisterAddin.cs b/src/RegisterAddin.cs index 5a1bf9f..098e71f 100644 --- a/src/RegisterAddin.cs +++ b/src/RegisterAddin.cs @@ -5,11 +5,12 @@ using System.Reflection; using System.Security.Policy; using Microsoft.Build.Framework; +using Microsoft.Build.Tasks; using Microsoft.Build.Utilities; namespace NetOfficeFw.Build { - public class RegisterAddin : Task + public class RegisterAddin : AppDomainIsolatedTask { [Required] public ITaskItem AssemblyPath { get; set; } @@ -24,15 +25,12 @@ public class RegisterAddin : Task public override bool Execute() { - AppDomain domain = null; try { var assemblyPath = this.AssemblyPath.ItemSpec; var assemblyDir = Path.GetDirectoryName(assemblyPath); - AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += (sender, args) => AssemblyEx.ReflectionOnlyAssemblyResolve(args, assemblyDir); - - var assembly = AssemblyEx.ReflectionOnlyLoadAssembly(assemblyPath); + var assembly = Assembly.UnsafeLoadFrom(assemblyPath); var assemblyName = assembly.GetName(); var assemblyCodebase = assemblyPath.GetCodebase(); var publicTypes = assembly.GetExportedTypes(); @@ -115,13 +113,6 @@ public override bool Execute() Log.LogErrorFromException(ex); return false; } - finally - { - if (domain != null) - { - AppDomain.Unload(domain); - } - } return true; } From 328ab90982276938bf3b5fbd6f5136e7ec7ddfc9 Mon Sep 17 00:00:00 2001 From: Jozef Izso Date: Sat, 7 Dec 2024 17:35:49 +0100 Subject: [PATCH 2/2] Remove unused code --- src/AssemblyEx.cs | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/src/AssemblyEx.cs b/src/AssemblyEx.cs index 4130aa7..1761306 100644 --- a/src/AssemblyEx.cs +++ b/src/AssemblyEx.cs @@ -17,44 +17,5 @@ public static string GetCodebase(this string path) path = path.Replace('\\', '/'); return $"file:///{path}"; } - - internal static Assembly ReflectionOnlyLoadAssembly(string path) - { - if (File.Exists(path)) - { - var assemblyName = AssemblyName.GetAssemblyName(path); - var assemblies = AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies(); - var existing = assemblies.FirstOrDefault(assembly => assembly.FullName == assemblyName.FullName); - if (existing != null) - { - return existing; - } - - var content = File.ReadAllBytes(path); - return Assembly.ReflectionOnlyLoad(content); - } - - return null; - } - - internal static Assembly ReflectionOnlyAssemblyResolve(ResolveEventArgs args, string baseDir) - { - Console.WriteLine($"Assembly: {args?.Name} by {args?.RequestingAssembly?.GetName()}"); - - var name = new AssemblyName(args.Name); - var path = Path.Combine(baseDir, name.Name + ".dll"); - Assembly assembly = null; - if (File.Exists(path)) - { - assembly = ReflectionOnlyLoadAssembly(path); - } - else - { - // Log.LogWarning($"Loading assembly by name '{args.Name}'."); - assembly = Assembly.ReflectionOnlyLoad(args.Name); - } - - return assembly; - } } }