Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b570205

Browse files
committed
Merge pull request pythonnet#50 from tonyroberts/develop
Fixes pythonnet#48 and pythonnet#49
2 parents 0416fda + 532f0b7 commit b570205

File tree

3 files changed

+33
-20
lines changed

3 files changed

+33
-20
lines changed

setup.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from distutils.command.build_ext import build_ext
77
from distutils.command.build_scripts import build_scripts
88
from distutils.command.install_lib import install_lib
9-
from distutils.sysconfig import get_config_vars
9+
from distutils.sysconfig import get_config_var
1010
from platform import architecture
1111
from subprocess import Popen, CalledProcessError, PIPE, check_call
1212
from glob import glob
@@ -183,15 +183,22 @@ def _build_monoclr(self, ext):
183183
depends=ext.depends)
184184

185185
output_dir = os.path.dirname(self.get_ext_fullpath(ext.name))
186-
py_libs = get_config_vars("BLDLIBRARY")[0]
186+
py_libs = get_config_var("BLDLIBRARY")
187187
libs += " " + py_libs
188188

189+
# Include the directories python's shared libs were installed to. This
190+
# is case python was built with --enable-shared as then npython will need
191+
# to be able to find libpythonX.X.so.
192+
runtime_library_dirs = (get_config_var("DESTDIRS") or "").split(" ")
193+
if ext.runtime_library_dirs:
194+
runtime_library_dirs.extend(ext.runtime_library_dirs)
195+
189196
self.compiler.link_executable(objects,
190197
_npython_exe,
191198
output_dir=output_dir,
192199
libraries=self.get_libraries(ext),
193200
library_dirs=ext.library_dirs,
194-
runtime_library_dirs=ext.runtime_library_dirs,
201+
runtime_library_dirs=runtime_library_dirs,
195202
extra_postargs=libs.split(" "),
196203
debug=self.debug)
197204

src/runtime/assemblymanager.cs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ internal class AssemblyManager {
3030
static ResolveEventHandler rhandler;
3131
static Dictionary<string, int> probed;
3232
static List<Assembly> assemblies;
33-
static Dictionary<string, Assembly> loadedAssemblies;
3433
internal static List<string> pypath;
3534

3635
private AssemblyManager() {}
@@ -47,7 +46,6 @@ internal static void Initialize() {
4746
probed = new Dictionary<string, int>(32);
4847
//generics = new Dictionary<string, Dictionary<string, string>>();
4948
assemblies = new List<Assembly>(16);
50-
loadedAssemblies = new Dictionary<string, Assembly>();
5149
pypath = new List<string>(16);
5250

5351
AppDomain domain = AppDomain.CurrentDomain;
@@ -204,24 +202,25 @@ public static Assembly LoadAssemblyPath(string name) {
204202
string path = FindAssembly(name);
205203
Assembly assembly = null;
206204
if (path != null) {
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-
}
205+
try { assembly = Assembly.LoadFrom(path); }
220206
catch {}
221207
}
222208
return assembly;
223209
}
224210

211+
//===================================================================
212+
// Returns an assembly that's already been loaded
213+
//===================================================================
214+
215+
public static Assembly FindLoadedAssembly(string name) {
216+
for (int i = 0; i < assemblies.Count; i++) {
217+
Assembly a = (Assembly)assemblies[i];
218+
if (a.GetName().Name == name) {
219+
return a;
220+
}
221+
}
222+
return null;
223+
}
225224

226225
//===================================================================
227226
// Given a qualified name of the form A.B.C.D, attempt to load
@@ -247,7 +246,10 @@ public static bool LoadImplicit(string name, bool warn=true) {
247246
if (assemblies == null) {
248247
assemblies = new HashSet<Assembly>(AppDomain.CurrentDomain.GetAssemblies());
249248
}
250-
Assembly a = LoadAssemblyPath(s);
249+
Assembly a = FindLoadedAssembly(s);
250+
if (a == null) {
251+
a = LoadAssemblyPath(s);
252+
}
251253
if (a == null) {
252254
a = LoadAssembly(s);
253255
}

src/runtime/moduleobject.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,11 @@ public static Assembly AddReference(string name)
385385
{
386386
AssemblyManager.UpdatePath();
387387
Assembly assembly = null;
388-
assembly = AssemblyManager.LoadAssemblyPath(name);
388+
assembly = AssemblyManager.FindLoadedAssembly(name);
389+
if (assembly == null)
390+
{
391+
assembly = AssemblyManager.LoadAssemblyPath(name);
392+
}
389393
if (assembly == null)
390394
{
391395
assembly = AssemblyManager.LoadAssembly(name);

0 commit comments

Comments
 (0)