Utilizarea IronPython în .NET
Unul dintre principalele avantaje ale mediului DLR este suportul pentru limbaje dinamice precum IronPython și IronRuby. S-ar putea să ne întrebăm de ce avem nevoie de alte limbaje, mai ales de cele care sunt utilizate în contextul unui alt limbaj, C#.
De fapt, limbajele dinamice, deși poate nu sunt utilizate frecvent, au domenii în care utilizarea lor este justificată. De exemplu, scrierea de scripturi client. Este posibil ca utilizatorul programului nostru să dorească să adauge un comportament suplimentar în program și pentru aceasta poate fi utilizat IronPython.
Se poate chiar spune că crearea de scripturi client este larg răspândită în zilele noastre, multe programe și chiar jocuri suportând adăugarea de scripturi client scrise în diverse limbaje.
În plus, este posibil să existe biblioteci în Python, a căror funcționalitate poate lipsi în .NET. Și în acest caz, IronPython ne poate ajuta din nou.
Să analizăm un exemplu de utilizare a IronPython. Dar, mai întâi, trebuie să adăugăm în proiect câteva pachete prin intermediul managerului de pachete NuGet. Pentru aceasta, facem clic dreapta pe nodul Dependencies din fereastra proiectului și selectăm opțiunea Manage NuGet Packages... (Gestionarea pachetelor NuGet) din lista care apare:

Se va deschide fereastra managerului de pachete. Pentru a găsi pachetul necesar, introducem în câmpul de căutare "DLR", iar managerul va afișa o serie de rezultate, dintre care al doilea - pachetul DynamicLanguageRuntime trebuie instalat.

După aceasta, în proiect, în nodul Dependencies, se adaugă biblioteca Microsoft.Scripting.
Acum trebuie să adăugăm și pachetul IronPython. Pentru aceasta, introducem în câmpul de căutare "IronPython" și apoi instalăm pachetul cu același nume:

După instalarea pachetului, în nodul Dependencies se adaugă biblioteca IronPython.
Acum să scriem un program simplu:
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
ScriptEngine engine = Python.CreateEngine();
engine.Execute("print('hello, world')");
Output în consolă:
hello, world
Aici este utilizată expresia print('hello, world') din limbajul Python, care afișează în consolă un șir de caractere. Pentru a crea motorul care execută scriptul, se folosește clasa ScriptEngine, iar metoda sa Execute() execută scriptul.
De asemenea, am putea defini un fișier hello.py, adică un fișier text simplu cu cod în limbajul Python, cu următorul conținut:
print("hello, fdc.com")
Și să-l rulăm în program:
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
ScriptEngine engine = Python.CreateEngine();
engine.ExecuteFile("hello.py");
În acest caz, se presupune că scriptul se află în proiect:

De asemenea, putem utiliza căi absolute, de exemplu, dacă scriptul se află pe calea "D://hello.py":
ScriptEngine engine = Python.CreateEngine();
engine.ExecuteFile("D://hello.py");
ScriptScope
Obiectul ScriptScope permite interacțiunea cu scriptul, obținând sau setând variabilele sale, obținând referințe la funcții. De exemplu, să scriem un script simplu hello2.py, care utilizează variabile:
x = 10
z = x + y
print(z)
Acum să scriem un program care să interacționeze cu scriptul:
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
int y = 22;
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
scope.SetVariable("y", y);
engine.ExecuteFile("hello.py", scope);
dynamic x = scope.GetVariable("x");
dynamic z = scope.GetVariable("z");
Console.WriteLine($"{x} + {y} = {z}");
Obiectul ScriptScope permite setarea variabilelor în script prin metoda SetVariable, iar cu ajutorul metodei GetVariable() le putem obține.
Output în consolă:
32
10 + 22 = 32
Apelarea funcțiilor din IronPython
Definim în fișierul hello.py o funcție pentru calcularea pătratului unui număr:
def square(n):
return n * n
Acum să apelăm această funcție în codul C#:
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
int number = 5;
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
engine.ExecuteFile("hello.py", scope);
dynamic square = scope.GetVariable("square");
// apelăm funcția și obținem rezultatul
dynamic result = square(number);
Console.WriteLine(result); // 25
Putem obține obiectul funcției la fel ca și o variabilă: scope.GetVariable("square");. Apoi, lucrăm cu acest obiect la fel ca și cu orice altă metodă. În final, când transmitem numărul 5 funcției square, rezultatul va fi 25.