亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python腳本和C#的互相調用

系統 1786 0

Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。是一門動態解釋型語言,也是一門膠水語言,很方面調用其它編程語言的程序。比如:C/C++,C#等等。這里介紹一下Python和C#的互相調用。

IronPython?是一種在 .NET 及 Mono上的 Python 實現,由微軟的 Jim Hugunin 所發起,是一個開源的項目,基于微軟的 DLR 引擎。

IronPython是流行的程序設計語言Python通向.NET framework的一個端口。微軟公司對于.NET framework的IronPython和動態語言非常關注。微軟公司已經在各種項目中提供了對IronPython的支持。

IronPython已經很好的集成到了.NET framework中,Python語言中的字符串對應于.NET的字符串對象,并且Python語言中對應的方法,在IronPython中也都提供了。其它數據類型也是一樣。

IronPython-2.7.8經過了一年的制作,終于發布了。這將是第一個支持 .NET Core 的版本。一些詳情的更新內容,請點擊這里查看。

下載地址:

  • IronPython-2.7.8.msi

  • IronPython.2.7.8.zip

  • IronPython.StdLib.2.7.8.zip

  • Source code ?(zip)

  • Source code ?(tar.gz)

?

1.IronPython 調用 .NET 標準庫

在這里我們使用VS2019進行開發,新建一個IronPython項目:

Python腳本和C#的互相調用_第1張圖片

?

如上圖創建一個IronPython 控制臺程序,命名為IronPythonTest 。在.NET中,有很多標準庫,在IronPython中,就可以使用import來引入這些標準庫來直接使用。看一個簡單的例子,我們使用.NET中的String和DateTime 。

Python腳本和C#的互相調用_第2張圖片

上面寫一個簡單的Python腳本,通過 IronPython2.7 .exe 解釋器執行。如下圖:

Python腳本和C#的互相調用_第3張圖片

2.IronPython調用 .NET? 自定義庫(DLL)

在.NET開發中,會經常通過References來引用一些.NET庫,當然在IronPython項目中,也可以引用并使用.NET庫。

例如,現在我們有一個Calc的計算類型,里面有一個Add和Sub方法。通過這個類型,生成了一個CalcLib.dll。R

            
              ?
namespace CalcLib
{
    public class Calc
    {
        public int Add(int a, int b)
        {
            return a + b;
        }

        public int Sub(int a, int b)
        {
            return a - b;
        }
    }
}

?
            
          

下面看看如何在IronPython項目中使用這個dll,在IronPython中,可以使用"clr"模塊來添加.NET引用,將CalLib.dll編譯好,放在IronPython 工程目錄和執行腳本同一目錄下:

?

Python腳本和C#的互相調用_第4張圖片

python腳本如下:

            
              import clr
clr.AddReference('CalcLib')
#clr.AddReferenceToFile('CalcLib.dll')
from CalcLib import Calc
print dir(Calc)
calcObj = Calc()
print "result of 3+4 is:", calcObj.Add(3,4)
print "result of 10+2 is:", calcObj.Sub(10,2)

raw_input("press Enter to exit!")
            
          

IronPython解釋執行:

Python腳本和C#的互相調用_第5張圖片

?

3.C#調用IronPython腳本

在.NET framework中,包含了IronPython的編譯器和執行引擎,所以我們可以通過C#代碼創建一個引擎實例,然后執行腳本。

先看看我們需要使用的類型:

  • ScriptEngine: 動態語言(IronPython)執行類,可于解析和執行動態語言代碼。
  • ScriptScope:構建一個執行上下文,其中保存了環境及全局變量;宿主(Host)可以通過創建不同的 ScriptScope 來提供多個數據隔離的執行上下文。
  • ScriptSource:操控動態語言代碼的類型,可以編譯(Compile)、運行(Execute)代碼。

現在我們有一個簡單的打印當前時間的IronPython腳本:

            
              from System import DateTime, String 
formatStr = String.Format("{0} {1}", "Hello World! The current date and time is ", DateTime.Now) 
print formatStr  
#print dir(String)

raw_input("press Enter to exit!")
            
          

先進一個C#控制臺項目,引入IronPython庫:

            
              using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ScriptEngine engine = Python.CreateEngine();
                ScriptScope scope = engine.CreateScope();

                ScriptSource script = engine.CreateScriptSourceFromFile(@"IronPythonTest.py");

                var result = script.Execute(scope);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }
    }
}
            
          

將控制臺exe程序輸出到IronPython腳本同一目錄:

Python腳本和C#的互相調用_第6張圖片

點擊運行,從C#程序調用了IronPython腳本(這里Exe必須和IronPython在同一目錄下,才可以成功調用)

Python腳本和C#的互相調用_第7張圖片

4.從C#給IronPython傳遞參數

在ScriptScope類型中,有一個SetVariable方法,我們可以通過這個方法給腳本傳遞參數。

public void SetVariable(string name, object value)

這樣,我們就可以把一個C#實例傳遞給IronPython,然后腳本就可以使用C#實例的成員。看一個例子:

            
              using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Test
{
    public class Student
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public override string ToString()
        {
            return string.Format("{0} is {1} years old", this.Name, this.Age);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ScriptEngine engine = Python.CreateEngine();
                ScriptScope scope = engine.CreateScope();
                Student stu = new Student { Name = "deokoo", Age = 28 };
                scope.SetVariable("stuObj",stu);
                ScriptSource script = engine.CreateScriptSourceFromFile(@"IronPythonTest.py");

                var result = script.Execute(scope);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

        }
    }

    

}

            
          

在這個例子中,C#代碼中創建了一個Student類型的實例,并把這個實例傳遞給了PrintStuInfo.py腳本:

            
              from System import DateTime, String 
formatStr = String.Format("{0} {1}", "Hello World! The current date and time is ", DateTime.Now) 
print formatStr  
#print dir(String)
print "Student name:", stuObj.Name
print "Student age:", stuObj.Age
print stuObj.ToString()
raw_input("press Enter to exit!")
            
          

通過輸出可以看到,IronPython腳本可以方便的訪問C#實例的成員:

Python腳本和C#的互相調用_第8張圖片

總結

本篇文章通過一些例子演示了IronPython與C#的交互,感覺有幾個例子還是很有意思的。

有時候使用C#調用IronPython可以使程序變得更加靈活,通過一個C#類型提供一組封裝好的操作,每次構建類型實例然后傳遞給腳本;這樣,用戶就可以編寫IronPython腳本,然后使用C#類型中提供的操作方法,從而實現不同的自定義操作。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲成人在线视频观看 | 亚洲国产成人精品一区91 | 色吧五月婷婷 | 国产成人精品免费午夜 | 成人国产在线视频 | 亚洲国产精品婷婷久久 | 特级毛片aaa免费版 特级毛片a级毛免费播放 | 韩国高清乱理伦片中文 | 亚洲第一欧美 | 久久国产香蕉视频 | 色综合视频一区二区三区 | 国产亚洲精品国产 | 久久国产午夜精品理论片34页 | 国产丶欧美丶日韩丶不卡影视 | 在线观看国产91 | 欧美特黄级乱色毛片 | 亚洲午夜一级毛片 | 孕妇孕妇aaaaa级毛片视频 | 仑乱高清在线一级播放 | 国产91系列 | 精品视频在线播放 | 日本免费中文字幕在线看 | 香蕉eeww99国产在线观看 | 色八戒国产一区二区三区四区 | 奇米影视7777777 | 最新日韩中文字幕 | 国产精品久久久久久久久福利 | 亚洲高清一区二区三区久久 | 女人zzzooooxxxx| 伊在人亚洲香蕉精品区麻豆 | 亚洲精品美女久久久久网站 | 成人综合网址 | 午夜影院操 | 国产亚洲美女精品久久久2020 | 在线精品中文字幕福利视频 | 好看的一级毛片 | 一级做a爱片久久蜜桃 | 精品一区二区三区免费毛片爱 | 国产精品一区在线麻豆 | 成人在线欧美 | 四虎精品影院在线观看视频 |