热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

.在.NET中使用DLR(转载)

转载自:http:chen1996.blog.163.comblogstatic4441005220091117102310427前言看到许多朋友写过,

转载自:http://chen1996.blog.163.com/blog/static/4441005220091117102310427/

前言

    看到许多朋友写过,在C#中调用DLR脚本的方法,但没有一个说的完整。如今我要说一个详细完整的,希望能对您有所帮助。本文,主要通过C#与IronPython脚本,来体现.NET与脚本互操作的过程。

什么是DLR

    DLR(Dynamic Language Runtime),是微软主导的一个开源项目。为.NET应用程序,提供了脚本技持。目前版本为0.9,你可以从Codeplex获得源吗。具体可以看我的博文《研究研究DLR》

总览

image1

    应用程序执行脚本的方法有很多种:

  1. 通过ScriptRuntime.ExcuteFile获得ScriptScope
  2. 通过ScriptRuntime.UseFile获得ScriptScope
  3. 通过ScriptRuntime.CreateScope获得ScriptScope,再执行ScripeScope.Execute或ScripeScope.IncludeFile
  4. 通过ScriptRuntime.GetEngine或ScriptRuntime.GetEngineByFileName获得ScriptEngine。调用ScriptEngine的CreateScriptSourceFromString或CreateScriptSourceFromFile或CreateScriptSourceFromStream创建ScriptSource,再执行ScriptSource.Execute。
  5. 有了ScriptSource也不一定要Execute,可以先调用Compile,产生CompiledCode,最后调用CompiledCode.Execute。

引用DLR

    首先,当然要获得DLR模块对应的DLL。您可以从Codeplex,下载取得。内容如下: 
Image2
我在工程目录下面建了一个DLR目录,并把这些文件都Copy进去。然后在解决方案资源管理器视图中,右键“引用”选择“添加引用” 
Image3 
点击“浏览”如下图 
Image4 
将“Microsoft.Scripting.Core.dll”“Microsoft.Scripting.dll”“Microsoft.Scripting.ExtensionAttribute.dll”等文件加入引用。我也不想说的更细了,具体参见Visual Studio的帮助文档。

    被引用的文件编译时会自己Copy到Bin目录去的,但没引用的文件是不会Copy的。我的做法是将这些文件加入工程,然后设置Copy。由于我只要使用Python语言,所以我只Copy了“IronPython.dll”、“IronPython.Modules.dll”与“App.Config”几个文件。

初始化

    引用了DLR之后,就要对DLR进行初始化。

  1. 首先要使用namespace 
    using Microsoft.Scripting.Hosting;
  2. 接着定义与创建ScriptRuntime 
    ScriptRuntime env = ScriptRuntime.CreateFromConfiguration(); 
    ScriptScope scope;
  3. 加载脚本,我在窗体的构造函数里,加入如下标黄的代码

public Window1() 

    InitializeComponent(); 
Assembly assembly = Assembly.GetAssembly(typeof(Contact)); 
    env.LoadAssembly(assembly); 
    scope = env.ExecuteFile("Test.py"); 
}

    前两行代码,执行ScriptRuntime.LoadAssembly,使脚本能直接使用当前程序集中的Class。接下来执行ScriptRuntime.ExecuteFile,运行Test.py脚本。

调用脚本的函数

    要调用脚本的函数,首先要定义一个方法的委托。通过委托调用脚本,是最高效的方式。当然,也可以用DynamicObject的TryInvoke方法,调用脚本的函数。这里我介绍委托的方式。

  1. 定义委托 
    delegate void ScriptOnLoad(Window window); 
    委托的参数形式,与脚本的参数一致。
  2. 调用脚本的函数 
    ScriptOnLoad fun; 
    if (scope.TryGetVariable("OnLoad", out fun)) 
        fun(this); 
    以上代码,TryGetVariable根椐函数名,获得委托。然后,再通过委托就可以直接调用脚本了。当然,您也可以将委托存起来,从而高效的调用函数。

脚本调用C#

下面看看Test.py脚本。

import WpfApplication 
def OnLoad(Window): 
    dataProvider = Window.FindResource("myDateCollectionDataSource") 
    data = dataProvider.Data; 
    c = WpfApplication.Contact("Chen1996", "Chen1996是个聪明人") 
    data.Add(c)

    这个脚本不长,但有三个关键点值得关注。

    第一行的import语句,相当于C#的using。其中WpfApplication,是这个C#程序的名字空间。之前初始化时调用LoadAssembly,还记得吗?ScriptRuntime的这个函数,就是用来加载程序集供脚本使用的。

    接下来第三行,Window.FindResource,非常简单的调用C#中的方法。DLR提供得,.NET原生支持就是好。后面第四行与第六行也都一样。这里并不依赖,初始化时通过LoadAssembly加载的程序集,因为一切都源参数Window这个对像。

    第四行,创建了一个WpfApplication.Contact的对象。WpfApplication,就是之前初始化时加载的程序集。为了要使用这个程序集里的类,就必须先加载。然后,就可以像使用脚本自己的类型一样使用了。还是得益于DLR,为我们提供的.NET原生支持,哈哈。

总之,C#与Python之间互操作,非常的简单又高效。同理通过这个例子,完全可以应用到所有的脚本语言及.NET语言。

转载自:http://chen1996.blog.163.com/blog/static/4441005220091117102310427/

转:https://www.cnblogs.com/icyJ/archive/2012/11/27/DLR2.html



推荐阅读
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • 1、PLSQLDeveloper记住登陆密码在使用PLSQLDeveloper时,为了工作方便希望PLSQLDeveloper记住登录Oracle的用户名和密码&#x ... [详细]
  • jsappsugar,基于,js,语法,定义 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 在加载一个第三方厂商的dll文件时,提示“找不到指定模块,加载失败”。由于缺乏必要的技术支持,百思不得期间。后来发现一个有用的工具 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
author-avatar
xzcxzfvxvc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有