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