[IronPython] "GetSearchPaths" does not return the default directories when run in a new Appdomain
mohammad mustaq
mustaq2001 at gmail.com
Fri Aug 20 14:15:56 CEST 2010
Hi,
When I create a python engine in a new Appdomain the "GetSearchPaths"
method return only the current directory. In default domain it returns
"Lib" as well as "Dll" directory in IronPython 2.6.1. Is there a way
to get these search paths while the engine is created in a new
Appdomain.
The reason being that the domain manager of the new Appdomain does not
have any information regarding the "EntryAssembly". Is there a way to
get the data in the Host's domain manager to the new Appdomain's
domain manager. I have provided a code illustrating this.
using System;
using Microsoft.Scripting;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;
class Foo
{
public static void Main(string[] args)
{
AppDomain ad = AppDomain.CreateDomain("foo");
ScriptEngine engine = Python.CreateEngine(ad);
engine.Runtime.LoadAssembly(typeof(MbrBase).Assembly);
ScriptSource code = engine.CreateScriptSourceFromString(@"
import MbrBase
class C(MbrBase):
def Test_C(self, log):
print 0
a = C()
", SourceCodeKind.Statements);
ScriptScope scope = engine.CreateScope();
code.Execute(scope);
Console.WriteLine("Trying to do it... {0}", AppDomain.CurrentDomain.Id);
MbrBase mbr = (MbrBase)scope.GetVariable("a");
string isSubClassCode = String.Format("issubclass({0},{1})",
"C", "MbrBase");
ScriptSource script =
engine.CreateScriptSourceFromString(isSubClassCode,
SourceCodeKind.Expression);
ICollection<string> paths = engine.GetSearchPaths(); // It
returns only current directory.
bool result = (bool)script.Execute(scope);
if (result == true)
{
ObjectOperations ops = engine.Operations;
ObjectHandle subClass = scope.GetVariableHandle("C");
// get back a handle
ObjectHandle instance = ops.Call(subClass, new
ObjectHandle[0]); // invoke the handle to create an instance
mbr = instance.Unwrap() as MbrBase; // now we know we
have an MBR and we can unwrap it to our local side
ObjectHandle temp = ops.GetMember(instance, "Test_C");
object log = null;
ops.Call(temp, log);
}
mbr.DoItVirtually();
mbr.DoIt();
Console.ReadKey();
}
}
public class MbrBase : MarshalByRefObject
{
public virtual void DoItVirtually()
{
Console.WriteLine("Did it virtually {0}", AppDomain.CurrentDomain.Id);
}
public void DoIt()
{
Console.WriteLine("Did it {0}", AppDomain.CurrentDomain.Id);
}
}
thanks,
Mustaq
More information about the Ironpython-users
mailing list