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

在考虑用动态语言之前也曾想过使用动态加载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不想要可以卸载吗_使用IronPython给.Net程序相关推荐

  1. ironpython不想要可以卸载吗_IronPython的致命弱点

    IronPython到最后还是编译为IL代码被执行了,这其中用到了动态生成程序集的技术. 然而,这个动态生成的程序集是需要在某个AppDomain中被定义的,因此,不可避免的要在AppDomain中加 ...

  2. ironpython console是否可以卸载_使用IronPython给.Net程序

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

  3. 苹果平板怎么卸载软件_怎么很好的卸载流氓软件!

    我相信在生活当中,很多人都会在不知情或者不注意的情况下,被迫下载很多自己不想要的软件,而且删除之后总是出现,挥之不去. 接下来我将会给大家分享几个下载此类软件的方法: 一.通过控制面板卸载 点击小图标 ...

  4. gifrecord可以卸载吗_频繁的安装和卸载app会不会伤害苹果手机?

    逼乎上看到一个xx的回答,转一下 作者:齐枫 问:频繁的安装和卸载app会不会伤害苹果手机?答:你好,会的知道为什么卸载APP的时候,所有APP图标都会一起抖动吗?除了被删的那个,其他的都被吓得瑟瑟发 ...

  5. idesk卸载教程_【亲测可行】Autodesk 卸载工具,一键完全彻底卸载删除autodesk软件专门卸载工具...

    autodesk卸载工具(AUTO Uninstaller)是专门为了针对autodesk类软件卸载不干净而导致autodesk安装失败问题进行研发的autodesk一键卸载工具.现在虽然360或一些 ...

  6. ironpython安装_安装 IronPython

    IronPython 1.0发布了IronPython是Python编程语言在.NET平台上的实现.它支持一个可交互的控制台,该控制台支持完全的动态编译,并且可以让Python程序员访问所有的.NET ...

  7. 如何卸载自己手机上的APK文件程序

    如何卸载自己手机上的APK文件程序 其实方法很简单,如果你刷新简体版系统的话就更容易找到删除的方法了. 桌面状态下按下"MENU"--"设置"--"应 ...

  8. java开发前的准备工作_三、开发java程序前的准备工作

    JDK[Java development kit]:Java开发工具包 JRE[Java runtime environment]:Java运行环境 JVM[Java virtual machine] ...

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

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

最新文章

  1. python装饰器学习
  2. 官宣!英雄联盟、王者荣耀、街霸……这些电子竞技入选杭州亚运会
  3. ThreadLocalMap的enrty的key为什么要设置成弱引用
  4. 算法应用 ---拆分字符串为n节字符
  5. oracle查询案例,2道经典的oracle查询案例
  6. maven 父maven_Maven不会吮吸。 。 。 但是Maven文件会
  7. C++ wstring 与 string 之间的相互转换.
  8. ptmalloc堆内存管理机制(主要讨论Linux x86下32位系统)
  9. C语言学习:malloc()函数
  10. alive的不生效 keep vue_webpack打包vue项目 keep-alive不生效
  11. Linux下如何同时启动多个Tomcat服务器
  12. testng使用DataProvider+Excel实现DDT
  13. python 分布式存储_Amazon S3 分布式存储的 python 接口实现
  14. 前端必会的Vue项目请求方法模块化的高度封装操作案例说明——getData()方法封装实例,告别多次重复调用,解决页面代码冗余
  15. 试用了5款BI分析工具,终于找到了上手最快的那一个!
  16. 为什么浏览器网页每次打开都是搜狗?
  17. linux c 获取文件大小
  18. Linux系统架构概述
  19. php之session_start详解
  20. 【GZ4-1-G24】哈威电磁阀

热门文章

  1. 20 Very Useful Java Code Snippets
  2. 感光电路板制作(转收藏)
  3. 我的iqoo已成功root了_红米Note8 刷机 root 备忘录
  4. 手写识别python_Python徒手实现识别手写数字—图像识别算法(K最近邻)
  5. linux查看CPU利用率与负载,Linux CPU负载利用率统计
  6. oracle full outer join,oracle 内连接(inner join)、外连接(outer join)、全连接(full join)...
  7. c3p0对mysql配置_c3p0的常用配置方式
  8. 按覆盖地理范围的不同计算机网络可分为,按网络覆盖的地理范围进行分类,计算机网络可以分为:...
  9. linux中daemonize用法,daemonize Unix系统后台守护进程管理软件
  10. 计算机无线模块怎样关闭,无线模块插在电脑上出现感叹号如何解决?教你三招...