Skip to content

Commit b65fa30

Browse files
committed
Use Assembly.Load(Byte[]) instead of Assembly.LoadFrom.
1 parent dfdcfe7 commit b65fa30

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

pythonnet/src/runtime/assemblymanager.cs

+15-1
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)