diff --git a/.gitignore b/.gitignore index 83a5664f..9c0a14cd 100644 --- a/.gitignore +++ b/.gitignore @@ -181,3 +181,8 @@ project.lock.json /src/.vs /.vs src/.idea + +# VS Code settings +.vscode/launch.json +.vscode/settings.json +.vscode/tasks.json diff --git a/src/Mapster.Tool/IsolatedAssemblyLoadContext.cs b/src/Mapster.Tool/IsolatedAssemblyLoadContext.cs new file mode 100644 index 00000000..e4366c65 --- /dev/null +++ b/src/Mapster.Tool/IsolatedAssemblyLoadContext.cs @@ -0,0 +1,48 @@ +using System; +using System.IO; +using System.Reflection; +using System.Runtime.Loader; + +namespace Mapster.Tool +{ + public class IsolatedAssemblyContext : AssemblyLoadContext + { + private readonly AssemblyDependencyResolver resolver; + + public IsolatedAssemblyContext(string assemblyPath) + { + resolver = new AssemblyDependencyResolver(assemblyPath); + } + + protected override Assembly Load(AssemblyName assemblyName) + { + string assemblyPath = resolver.ResolveAssemblyToPath(assemblyName); + if (assemblyPath != null) + { + return LoadFromAssemblyPath(assemblyPath); + } + + return null; + } + + protected override IntPtr LoadUnmanagedDll(string unmanagedDllName) + { + string libraryPath = resolver.ResolveUnmanagedDllToPath(unmanagedDllName); + if (libraryPath != null) + { + return LoadUnmanagedDllFromPath(libraryPath); + } + + return IntPtr.Zero; + } + + public static Assembly LoadAssemblyFrom(string assemblyPath) + { + Console.WriteLine($"Loading assembly from {assemblyPath}"); + IsolatedAssemblyContext loadContext = new IsolatedAssemblyContext(assemblyPath); + return loadContext.LoadFromAssemblyName( + new AssemblyName(Path.GetFileNameWithoutExtension(assemblyPath)) + ); + } + } +} diff --git a/src/Mapster.Tool/Program.cs b/src/Mapster.Tool/Program.cs index 4066ef52..22452503 100644 --- a/src/Mapster.Tool/Program.cs +++ b/src/Mapster.Tool/Program.cs @@ -60,7 +60,7 @@ private static void WriteFile(string code, string path) private static void GenerateMappers(MapperOptions opt) { - var assembly = Assembly.LoadFrom(Path.GetFullPath(opt.Assembly)); + var assembly = IsolatedAssemblyContext.LoadAssemblyFrom(Path.GetFullPath(opt.Assembly)); var config = TypeAdapterConfig.GlobalSettings; config.SelfContainedCodeGeneration = true; config.Scan(assembly); @@ -150,7 +150,7 @@ private static string GetImplName(string name) private static void GenerateModels(ModelOptions opt) { - var assembly = Assembly.LoadFrom(Path.GetFullPath(opt.Assembly)); + var assembly = IsolatedAssemblyContext.LoadAssemblyFrom(Path.GetFullPath(opt.Assembly)); var codeGenConfig = new CodeGenerationConfig(); codeGenConfig.Scan(assembly); @@ -381,7 +381,7 @@ private static void ApplySettings(TypeAdapterSetter setter, BaseAdaptAttribute a private static void GenerateExtensions(ExtensionOptions opt) { - var assembly = Assembly.LoadFrom(Path.GetFullPath(opt.Assembly)); + var assembly = IsolatedAssemblyContext.LoadAssemblyFrom(Path.GetFullPath(opt.Assembly)); var config = TypeAdapterConfig.GlobalSettings; config.SelfContainedCodeGeneration = true; config.Scan(assembly);