开发的时候,经常被策划频繁变动的方案而苦恼。这时候就想要加入点动态语言来辅助一下。

在考虑用动态语言之前也曾想过使用动态加载dll的方式,实现基础接口来调用。在卸载的时候遇到了问题,虽可以通过应用程序域来绕过,但这又加入了应用程序域之间的交互。没有动态语言来的方便。

在C#中使用IronPython

新建一个项目,ConsoleApplication

然后NuGet添加IronPython包

在Main函数中编写如下代码:

ScriptEngine engine = Python.CreateEngine();

ScriptScope scope = engine.CreateScope();

string script = "print('Hello world!')";

var sourceCode = engine.CreateScriptSourceFromString(script);

var result = sourceCode.Execute(scope);

Console.WriteLine(result);

这里用到了三个主要类型:ScriptEngine, ScriptScope, ScriptSource

顾名思义ScriptEngine是引擎,ScriptScope相当于一个容器可用于传递一些自定义的变量,ScriptSource就是脚本源码。

运行后输出结果:Hello world!

C#向IronPython传递变量

将上面的代码修改如下

ScriptEngine engine = Python.CreateEngine();

ScriptScope scope = engine.CreateScope();

string script = "print('Hello %d' %number)";

scope.SetVariable("number", 123);

ScriptSource sourceCode = engine.CreateScriptSourceFromString(script);

var result = sourceCode.Execute(scope);

Console.WriteLine(result);

输出结果变为:Hello 123

还可以试试更奇妙的,比如C#定义一个类

public class Foo

{

public string Name { get; set; }

public DateTime Birthday { get; set; }

}

传入这个变量试试,修改Main函数的代码

ScriptEngine engine = Python.CreateEngine();

ScriptScope scope = engine.CreateScope();

string script = @"print('Hello %s' %foo.Name)

foo.DoSth()";//注意这里换行是必须的

Foo foo = new Foo()

{

Name = "阿萨德",

Birthday = new DateTime(1999,2,2)

};

scope.SetVariable("foo", foo);

ScriptSource sourceCode = engine.CreateScriptSourceFromString(script);

var result = sourceCode.Execute(scope);

Console.WriteLine(result);

成功输出:Hello 阿萨德

那么如果调用Foo里的方法呢?可以哦,你可以试一试,还能够命中断点呢!

执行IronPython文件

将script字符串替换为文件路径,使用ScriptEngine的CreateScriptSourceFromFile方法可以执行文件格式的IronPython

新建文件,名为test.py, 将上面的script字符粘贴到文件内。修改文件的属性为“如果较新则复制”。

那么Main函数的代码段就是:

ScriptEngine engine = Python.CreateEngine();

ScriptScope scope = engine.CreateScope();

string path = @"test.py";

Foo foo = new Foo()

{

Name = "阿萨德",

Birthday = new DateTime(1999,2,2)

};

scope.SetVariable("foo", foo);

ScriptSource sourceCode = engine.CreateScriptSourceFromFile(path);

var result = sourceCode.Execute(scope);

Console.WriteLine(result);

执行成功,输出结果不变。

但是此时编辑器对py文件的支持是木有的,此时可以安装一个插件,Python Tools for Visual Studio 简称PTVS,可以在GitHub上获取到:https://github.com/Microsoft/PTVS/releases

安装之后,就有了语法高亮和智能提示哦~

这个工具增加了很多对Python的支持,你还能在新建项目中看到新增的Python模板,包括了Django等一些流行的Python网站模板,当然IronPython的模板也是不可少的。

在IronPython中使用C#的类型

还有一个问题,刚才在foo中定义了Birthday这个属性,但是它的类型是DateTime,如何在IronPython中使用它呢?

修改test.py文件中的代码

print('Hello %s' %foo.Name)

foo.DoSth()

from System import DateTime

print("My birthday is %s" %foo.Birthday.ToString())

这里我使用了from System import DateTime这行语句就引入了DateTime的类型

同样的,你也可以引入System程序集中的String、TimeSpan等类型,方便得一塌糊涂,比如这样

from System import *

如果需要添加程序集引用呢?

比如我新建了一个类库,将Foo类放到了这个新的类库中,那么我要使用Foo的时候,只要这样:

import clr,sys

clr.AddReference('Foo')

from Foo import Foo

foo = Foo()

foo.Name = "haha"

print('Hello %s' %foo.Name)

from System import *

print("My birthday is %s" %foo.Birthday.ToString())

或许你的程序将告诉你一个找不到Module的错误,那就把Foo.dll拷贝到你的执行目录下。或者你也可以修改Main函数中的代码,使用engine.SetSearchPaths(new[]{@"../Foo/bin/Debug"});设置查找类库的路径。

如果报告无法在Foo中找到Foo类型,那就是你拷贝Foo类的代码到类库中去的时候没有使用Foo类库的namespace。

其他

现在已经知道了如何在C#中使用IronPython,以及在IronPython的代码中使用C#的类型和变量传递,那么就可以在你的C#程序中加入炫酷的脚本语言动态特性了。

关于CreateScriptSource的时机,你或许可以使用FileSystemWatcher类来监视文件修改,不过要注意多线程问题哦。

如果你并不需要在C#中加入IronPython,而仅仅只是想要用Python一样的语法来做一些.net的程序比如winform、wpf之类的,你可以安装IronPython的安装包,安装包在最上面给出的官网地址中有下载。安装之后将获得IronPython单独运行的环境和相关的文档。

然后你就可以通过PTVS帮你新增的几个IronPython项目模板来创建你的IronPython程序了。

而且,他们是支持断点调试的哦!你是不是有了好点子呢,比如在C#项目中使用Link文件来链接IronPython项目中的py文件,^_^

我已经迫不及待地想要写一个可以编辑脚本的小游戏来玩玩了呢。

最后加一个在GitHub上看到的IronPython的小游戏Sample。

使用IronPython给.Net程序加点料

开发的时候,经常被策划频繁变动的方案而苦恼.这时候就想要加入点动态语言来辅助一下. 在考虑用动态语言之前也曾想过使用动态加载dll的方式,实现基础接口来调用.在卸载的时候遇到了问题,虽可以通过应用程序 ...

IronPython和C#交互

IronPython和C#交互 IronPython是一个.NET平台上的Python实现,包括了完整的编译器.执行引擎与运行时支持,能够与.NET已有的库无缝整合到一起. IronPython已经很 ...

Python之路3【第一篇】Python基础

本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...

Python之路【第一篇】:Python简介和入门

python简介: 一.什么是python Python(英国发音:/ pa θ n/ 美国发音:/ pa θɑ n/),是一种面向对象.直译式的计算机程序语言. 每一门语言都有自己的哲学: pyth ...

Python系列教程(一):简介

Python发展历史 起源 Python的作者,Guido von Rossum,荷兰人.1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受 ...

Python应用场景

Web应用开发 Python经常被用于Web开发.比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序.Python定义了WSGI标准应用接口来协调Http服务器与基于P ...

2.python数据类型

1 Number(数字) 2   字符串类型(string)   字符串内置方法 # string.capitalize() 把字符串的第一个字符大写 # string.center(width) 返 ...

Python之路【第一篇】:Python简介和入门

python简介: 一.什么是python Python(英国发音:/ pa θ n/ 美国发音:/ pa θɑ n/),是一种面向对象.直译式的计算机程序语言. 每一门语言都有自己的哲学: pyth ...

1.python简介

简介 1.python语言介绍 python的创始人:Guido Van Rossum 2.python是一门什么样的语言 编程语言主要从以下几个角度进行分类:编译型,静态型,动态性,强类型定义语言和 ...

随机推荐

EF连接PostgreSql

1.用nuget安装npgsql和EF 注意,Nuget一定要安装Npgsql的2.2.7版本,更高版本nuget在后面安装EF的时候无法自动解析. install-Package Npgsql -V ...

Generate Ubuntu Install Media On Mac

Opps, my computer system was broken again... Let's repire it. Introduction The system of my PC is br ...

快速入门系列--MVC--02路由

现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...

pylint window下安装与使用

简介 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8)和有潜在问题的代码. Pylint ...

Entity Framework SqlFunctions 教你如何在EF调用sqlserver方法的函数存根

今天算是研究了一天的SqlFunctions,请教了几个群的牛人,居然发现大伙对这个都比较陌生, 有的甚至直指EF中是不能调用sqlserver里的方法的. 因为之前搞过linq to sql 里面的 ...

matlab实现判断是否能否生成严格对角占优矩阵

如题: function X = IsStrictDiagMatrix(A) % input: A matrix % output: The matrix after transformation % ...

10 things you should know about NoSQL databases

For a quarter of a century, the relational database (RDBMS) has been the dominant model for database ...

Hdu 1452 Happy 2004(除数和函数,快速幂乘(模),乘法逆元)

Problem Description Considera positive integer X,and let S be the sum of all positive integer diviso ...

PHP 5.4.8 添加系统服务命令

之前没注意,PHP 5.4.8 的安装包有自带的系统服务注册文件的 打开编译安装包,换成你自己的路径 cd /mydata/soft/php-5.4.8/ cp sapi/fpm/init.d.php ...

Eclipse 快捷键和模板设置

快捷键设置 菜单  Window --> Preferences---General---Keys Content Assist:  代码提示快捷键 模板设置 新建一个模板 在Insert Va ...

ironpython console是否可以卸载_使用IronPython给.Net程序相关推荐

  1. ironpython console是否可以卸载_IronPython的第十块鳞片

    IronPython0.7.6于6月14日发布了, 版本升级的速度确实让人满意啊! 然后再看看自己的鳞片系列的速度,真的好惭愧,看来得好好加把劲了. 这一次的升级动作可谓之巨大,至少我得把原来.NET ...

  2. ironpython不想要可以卸载吗_使用IronPython给.Net程序

    开发的时候,经常被策划频繁变动的方案而苦恼.这时候就想要加入点动态语言来辅助一下. 在考虑用动态语言之前也曾想过使用动态加载dll的方式,实现基础接口来调用.在卸载的时候遇到了问题,虽可以通过应用程序 ...

  3. ironpython console怎么用_如何在表單中插入ironpython控制台?

    I want to make a winform by C#, and add a ironpython console window in it, like a multiline textbox. ...

  4. 电脑ironpython什么用处能卸载吗_IronPython 的几个问题

    跨语言和跨编译器的那些坑(CPython vs IronPython) 代码是宝贵的,世界上最郁闷的事情,便是写好的代码,还要在另外的平台上重写一次,或是同时维护功能相同的两套代码.所以才需要跨平台. ...

  5. 移动应用程序和网页应用程序_您的移动应用程序运行缓慢的主要原因以及如何修复它...

    移动应用程序和网页应用程序 by Rajput Mehul 通过拉杰普特·梅胡尔(Rajput Mehul) 您的移动应用程序运行缓慢的主要原因以及如何修复它 (Top Reasons Why You ...

  6. android 安装卸载应用提醒_Android监听程序的安装和卸载

    在android系统中,安装和卸载都会发送广播,当应用安装完成后系统会发android.intent.action.PACKAGE_ADDED广播.可以通过intent.getDataString() ...

  7. 天天有毒_鸡汤文案类小程序源码

    简介: 天天有毒_鸡汤文案类小程序源码 网盘下载地址: http://kekewl.net/oi8WRaw46rq0 图片:

  8. 重启计算机请等待当前程序完成卸载,Win7卸载软件提示“请等待当前程序完成卸载或更改”要怎么办呢?...

    Win7卸载软件提示"请等待当前程序完成卸载或更改"要怎么办呢? 发布时间:2019-03-29 小编:yue 浏览数: 大家在使用win7系统的过程中,时间久了,就会有一些不用的 ...

  9. 重启计算机请等待当前程序完成卸载,Win7卸载软件提示“请等待当前程序完成卸载或更改”三种解决方法...

    win7系统运行时间久了,会堆积很多不用的软件,一般会进入win7系统控制面板来卸载不需要软件,右键点击软件卸载时会出现"请等待当前程序完成卸载或更改"的提示(如下图所示),这该如 ...

最新文章

  1. arduino蓝牙通讯代码_「Arduino」OLED屏使用教程,显示内容听谁的?我不管,听我的...
  2. Android单元测试设置
  3. OpenCV加mySQL树莓派_树莓派3B/3B+和4B安装OpenCV教程 (详细教程)
  4. /etc目录下重要文件解释
  5. Windows 下搭建 Ruby 开发环境
  6. ubuntu关闭自动更新、打开 ubuntu 的 apport 崩溃检测报告功能
  7. bzoj 1207: [HNOI2004]打鼹鼠【dp】
  8. Docker镜像保存save、加载load
  9. WEB开发常用软件集合
  10. 360n4刷android8.1,【从此,任何人都可以刷N4】关于系统降级===线刷方法,我也说两句吧。...
  11. GIS空间分析(一)——空间分析与GIS
  12. Java Web图书管理系统(MVC框架)-包含源码
  13. #第四章 星光灿烂4.1苍穹
  14. 《用户至上:用户研究方法与实践(原书第2版)》一2.3 理解产品
  15. 从华为辞职门 看IT人如何度过下半生(转载)
  16. [Python深度学习入门]实战一·Numpy梯度下降求最小值
  17. 三,c程序的编辑,编译,链接和运行
  18. idea在线激活 16
  19. python的staticmethod,classmethod和装饰器以及闭包
  20. 三个bypass案例分享

热门文章

  1. 微信tt服务器,微信,TT,禁令解除
  2. mac云显卡服务器_云显卡玩吃鸡 NV GeForce NOW登陆Mac
  3. Raspbian安装ROS系统Kinectic
  4. Axure设计的界面如何生成HTML文件
  5. vscode怎么快速生成html页面骨架
  6. 安川机器人之MotoPlus编程
  7. 天载正规股票轮动行情明显
  8. 物理学习:6招帮你搞定高中物理考试的计算题
  9. 防沉迷系统 游戏运营商笑了
  10. 第8课 如何使用开发环境命令行注册EOS靓号?