經過DLR Hosting APIs把DLR語言(如IronPython、IronRuby)嵌入到.NET應用程序

IronPython是Python編程語言的一種開源實現,它可以與.NET Framework框架緊密集成。IronPython可使用.NET Framework和Python標準類庫,而.NET語言也能夠很簡單地使用Python代碼。python

使用Visual Studio建立一個單元測試項目,添加Microsoft.CSharp.dll的引用,經過Nuget添加IronPython包,在項目中添加下面代碼,運行單元測試。編程

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProjectIronPython
{
    [TestClass]
    public class UnitTest1
    {
        //基本用法
        [TestMethod]
        public void TestMethod1()
        {
            //建立腳本引擎
            var engine = IronPython.Hosting.Python.CreateEngine();
            //編寫腳本
            var pythonScript = "1+1";
            //經過引擎執行腳本
            var sum = engine.Execute<int>(pythonScript);
            //判斷c#中執行和IronPython中執行結果是否相等
            Assert.AreEqual(1 + 1, sum);
        }

        //傳入變量
        [TestMethod]
        public void TestMethod2()
        {
            //建立腳本引擎
            var engine = IronPython.Hosting.Python.CreateEngine();
            //經過引擎建立做用域
            var scope = engine.CreateScope();
            //建立變量
            var a = 1;
            var b = 2;
            //在做用域中設置變量
            scope.SetVariable("a", a);
            scope.SetVariable("b", b);
            //待執行腳本
            var pythonScript = "a+b";
            //經過引擎建立腳本源
            var scriptSource = engine.CreateScriptSourceFromString(pythonScript);
            //在做用域上執行腳本源
            var sum = scriptSource.Execute<int>(scope);
            //判斷c#中執行和IronPython中執行結果是否相等
            Assert.AreEqual(a + b, sum);
        }

        //傳入函數
        [TestMethod]
        public void TestMethod3()
        {
            //建立腳本引擎
            var engine = IronPython.Hosting.Python.CreateEngine();
            //經過引擎建立做用域
            var scope = engine.CreateScope();
            //建立函數
            Func<int,int> fn = (i) => i * i;
            //在做用域中設置變量
            scope.SetVariable("fn", fn);
            //待執行腳本
            var pythonScript = "fn(4)";
            //在做用域上執行腳本源
            var scriptSource = engine.CreateScriptSourceFromString(pythonScript);
            //在做用域上執行腳本源
            var result = scriptSource.Execute<int>(scope);
            //判斷c#中執行和IronPython中執行結果是否相等
            Assert.AreEqual(fn(4), result);
        }

        //IronPython定義函數,.NET調用
        [TestMethod]
        public void TestMethod4()
        {
            //建立腳本引擎
            var engine = IronPython.Hosting.Python.CreateEngine();
            //編寫腳本
            var pythonScript = "lambda x:x*x";
            //動態類型訪問python對象
            dynamic result = engine.Execute(pythonScript);
            //判斷c#中執行和調用IronPython執行結果是否相等
            Assert.AreEqual(4 * 4, result(4));
        }

        //編譯運行
        [TestMethod]
        public void TestMethod5()
        {
            //建立腳本引擎
            var engine = IronPython.Hosting.Python.CreateEngine();
            //經過引擎建立做用域
            var scope = engine.CreateScope();
            //建立函數
            Func<int, int> fn = (i) => i * i;
            //在做用域中設置變量
            scope.SetVariable("fn", fn);
            //待執行腳本
            var pythonScript = "fn(4)";
            //在做用域上執行腳本源
            var scriptSource = engine.CreateScriptSourceFromString(pythonScript);
            //編譯腳本源
            var compileCode = scriptSource.Compile();
            //在做用域上執行腳本源
            var result = compileCode.Execute<int>(scope);
            //判斷c#中執行和IronPython中執行結果是否相等
            Assert.AreEqual(fn(4), result);
        }
    }
}
相關文章
相關標籤/搜索