Question

Suppose we have the following code in IronPython:

def hello():
    print "Hello from Python"

We call function hello() in the following C# code:

    private static void GetPythonFunction()
    {
        ScriptRuntime scriptRuntime = IronPython.Hosting.Python.CreateRuntime();
        ScriptScope scope = scriptRuntime.ExecuteFile(@"Python\helloFunc.py");
        Action hello = scope.GetVariable<Action>("hello");
        hello();
        scriptRuntime.Shutdown();
        hello(); // after IronPython runtime was disposed
    }

Which gives us result:

Hello from Python
Hello from Python

Why the second call hello() works twice even though the runtime environment was disposed?

Was it helpful?

Solution

Shutdown doesn't actually terminate the runtime, it just runs some cleanup routines. Things might be in a strange state afterwards, though, so there's no guarantee anything will work.

Plus, hello probably (I don't recall the exact details of how the delegates are created) has references to the runtime and engine keeping everything from being GC's.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top