using System;
using IronPython.Hosting;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
public class Program
{
// Delegate matching the signature of the factorial function
delegate int FactorialDelegate(int n);
static void Main(string[] args)
{
// Our factorial function
string[] lines = {"def factorial(n):",
" for i in range(1, n):",
" n = n * i",
" return n"};
string code = String.Join("\r", lines);
// Instantiate the IronPython environment
ScriptEngine engine = Python.CreateEngine();
// Create a scope/module to work in
ScriptScope scope = engine.CreateScope();
// A little preparation
ScriptSource source = engine.CreateScriptSourceFromString(code, SourceCodeKind.Statements);
// Compile the code
CompiledCode compiled = source.Compile();
// Execute the code in the scope
compiled.Execute(scope);
//Now the factorial function exists in the IronPython environment. Let's use it.
// Set x = 5
scope.SetVariable("x", 5);
// print factorial(x)
ScriptSource print = engine.CreateScriptSourceFromString("print factorial(x)", SourceCodeKind.SingleStatement);
print.Execute(scope); //outputs 120
// Get the result from IronPython
int result1 = scope.Execute<int>("factorial(6)");
Console.WriteLine(result1); //outputs 720
// We can also call the function directly from C#
FactorialDelegate factorial = scope.GetVariable<FactorialDelegate>("factorial");
int result2 = factorial(7);
Console.WriteLine(result2); //outputs 5040
Console.Read();
}
}