diff --git a/DSIronPython/DSIronPython.csproj b/DSIronPython/DSIronPython.csproj index d2cb92a..05c7e7f 100644 --- a/DSIronPython/DSIronPython.csproj +++ b/DSIronPython/DSIronPython.csproj @@ -3,7 +3,7 @@ - $(SolutionDir)\package_output\DSIronPython\bin\ + $(SolutionDir)\package_output\DSIronPython\extra\ {9EEF4F42-6B3B-4358-9A8A-C2701539A822} Library Properties @@ -29,7 +29,7 @@ - + diff --git a/IronPythonExtension/IronPythonExtension.cs b/IronPythonExtension/IronPythonExtension.cs index 38babc3..89be644 100644 --- a/IronPythonExtension/IronPythonExtension.cs +++ b/IronPythonExtension/IronPythonExtension.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Reflection; +using System.Runtime.Loader; using Dynamo.Extensions; using Dynamo.Logging; using Dynamo.PythonServices; @@ -61,26 +62,9 @@ public void Startup(StartupParams sp) /// public void Ready(ReadyParams sp) { - // Searches for DSIronPython engine binary in same folder with extension itself - var targetDir = Path.GetDirectoryName(Assembly.GetAssembly(typeof(IronPythonExtension)).Location); - var libraryLoader = sp.StartupParams.LibraryLoader; - Assembly pythonEvaluatorLib = null; - try - { - pythonEvaluatorLib = Assembly.LoadFrom(Path.Combine(targetDir, PythonEvaluatorAssembly + ".dll")); - } - catch (Exception ex) - { - // Most likely the IronPython engine is excluded in this case - // but logging the exception message in case for diagnose - OnMessageLogged(LogMessage.Info(ex.Message)); - return; - } - // Import IronPython Engine into VM, so Python node using IronPython engine could evaluate correctly - if (pythonEvaluatorLib != null) - { - libraryLoader.LoadNodeLibrary(pythonEvaluatorLib); - } + var extraPath = Path.Combine(new FileInfo(Assembly.GetAssembly(typeof(IronPythonExtension)).Location).Directory.Parent.FullName, "extra"); + var alc = new IsolatedPythoContext(Path.Combine(extraPath,"DSIronPython.dll")); + alc.LoadFromAssemblyName(new AssemblyName("DSIronPython")); } /// @@ -91,4 +75,35 @@ public void Shutdown() // Do nothing for now } } + internal class IsolatedPythoContext : AssemblyLoadContext + { + private AssemblyDependencyResolver resolver; + + public IsolatedPythoContext(string libPath) + { + resolver = new AssemblyDependencyResolver(libPath); + } + + 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; + } + } } diff --git a/IronPythonExtension/IronPythonExtension.csproj b/IronPythonExtension/IronPythonExtension.csproj index f03e34e..41e7a85 100644 --- a/IronPythonExtension/IronPythonExtension.csproj +++ b/IronPythonExtension/IronPythonExtension.csproj @@ -3,7 +3,7 @@ - $(SolutionDir)\package_output\DSIronPython\bin\ + $(SolutionDir)\package_output\DSIronPython\extra\ {182FCA4E-B6EF-451F-9EC4-7BF2C622F4F7} Library Properties @@ -21,6 +21,6 @@ - + \ No newline at end of file diff --git a/IronPythonExtension/IronPythonExtension_ExtensionDefinition.xml b/IronPythonExtension/IronPythonExtension_ExtensionDefinition.xml index a149d07..1ab1acc 100644 --- a/IronPythonExtension/IronPythonExtension_ExtensionDefinition.xml +++ b/IronPythonExtension/IronPythonExtension_ExtensionDefinition.xml @@ -1,4 +1,4 @@ - ..\bin\IronPythonExtension.dll + IronPythonExtension.dll IronPythonExtension.IronPythonExtension \ No newline at end of file