@@ -30,6 +30,7 @@ internal class AssemblyManager {
3030 static ResolveEventHandler rhandler ;
3131 static Dictionary < string , int > probed ;
3232 static List < Assembly > assemblies ;
33+ static Dictionary < string , Assembly > loadedAssemblies ;
3334 internal static List < string > pypath ;
3435
3536 private AssemblyManager ( ) { }
@@ -46,6 +47,7 @@ internal static void Initialize() {
4647 probed = new Dictionary < string , int > ( 32 ) ;
4748 //generics = new Dictionary<string, Dictionary<string, string>>();
4849 assemblies = new List < Assembly > ( 16 ) ;
50+ loadedAssemblies = new Dictionary < string , Assembly > ( ) ;
4951 pypath = new List < string > ( 16 ) ;
5052
5153 AppDomain domain = AppDomain . CurrentDomain ;
@@ -202,7 +204,19 @@ public static Assembly LoadAssemblyPath(string name) {
202204 string path = FindAssembly ( name ) ;
203205 Assembly assembly = null ;
204206 if ( path != null ) {
205- try { assembly = Assembly . LoadFrom ( path ) ; }
207+ if ( loadedAssemblies . ContainsKey ( path ) ) {
208+ return loadedAssemblies [ path ] ;
209+ }
210+ // Avoid using Assembly.LoadFrom as referenced assemblies that exist
211+ // in the same path will be loaded directly from there, rather than
212+ // using other versions already loaded. This is a problem if there
213+ // is a Python.Runtime.dll in the same folder as the assembly being
214+ // loaded, as that will result in two instances being loaded.
215+ try {
216+ byte [ ] bytes = System . IO . File . ReadAllBytes ( path ) ;
217+ assembly = Assembly . Load ( bytes ) ;
218+ loadedAssemblies [ path ] = assembly ;
219+ }
206220 catch { }
207221 }
208222 return assembly ;
0 commit comments