【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

ASP.NET vNext 允许你自定义项目加载器以及对多种语言的支持

  • 2014-09-08
  • 本文字数:1413 字

    阅读完需:约 5 分钟

ASP.NET vNext 运行时会在实际运行 C#源代码之前使用 Rosylyn 编译器对代码进行编译并加载。 David Fowler 为大家演示了如何使用 KRuntime 加载程序的依赖注入功能,让你选择的编程语言也可以支持 vNext。

KRuntime 加载程序包含了创建并运行 ASP.NET vNext 应用程序所需要的全部功能,出于设计原则的考虑,运行时本身无法分辨何谓“设计时”这一概念,编辑与加载操作是同时发生的。由于这一原因,KRuntime 定义了多个独有的加载器,它们会从project.json 文件中读取全部依赖项,随后与项目本身的源代码一起进行构建。

项目引用(project reference)加载器的行为十分有趣,在默认情况下,它会调用 RosylynProjectReferenceProvider ,后者会返回一个 RosylynProjectReference 对象。正如其名称所显示的一样,它会使用 Rosylyn C#编译器对 C#源代码进行编译并加载程序集。

不过这一行为是可以被覆盖的,David Fowler 演示了相应的做法。

ASP.NET vNext 中对 F#的支持

让我们来看一下 David 在 github 上所创建的 vNextLanguageSupport 项目,他在项目中定义了一个 FSharpProjectReferenceProvider 类,实现了 IProjectReferenceProvider 接口。该类中的方法会返回一个 FSharpProjectReference 对象,后者则实现了 IMetadataProjectReference 接口。

FSharpProjectReference 在 Emit 方法中进行了一系列的操作:

  • 遍历项目引用
  • 将全部引用拷贝到某个临时文件夹中
  • 使用 fsc 编译器对源代码文件,以及这些引用进行编译
  • 删除临时文件

这两个类都可以在 FSharpSupport 项目中找到,因此可以将其编译后作为一个程序集进行引用。值得一提的是,虽然这两个类的实现是为了支持 F#,但它们自身是用 C#语言编写的。

David 随后在一个 F#项目示例中使用了这两个类,为此他特意在 project.json 文件中定义了 projectReferenceProviderType 属性。

(代码片段)

复制代码
"language": {
"name": "F#",
"assembly": "FSharpSupport",
"projectReferenceProviderType": "FSharpSupport.FSharpProjectReferenceProvider"
},

这样,你的 ASP.NET vNext 应用就能够支持 F#了。项目的启动类现在是一个F#类型,而不是C#类了。

虽然这个示例中只用到了F#,但你可以使用相同技术让任何CLR 语言都为ASP.NET vNext 所支持,所需的只是为IMetadataProjectReference 和IProjectReferenceProvider 接口提供你自己的实现。

Aleksander Heintz 也在多篇文章中针对 David 的示例进一步进行了详细解释:

项目加载器是如何运行的(请注意:这篇文章有些内容过时了,比方说RosylynAssemblyLoader 这个类现在已经不存在了)。

关于FSharpReferenceProvider 的更多细节

如何使用上述以C#代码实现的FSharpReferenceProvider 类,让它加载一个真正的F#实现(并使用该F#实现以加载F#源代码)!

这个示例本身并不复杂,但它为我们演示了KRuntime 所使用的内置依赖注入的强大功能,它为你在项目中加入新特性提供了许多灵活性。正如在 KRuntime 结构一文中所说明的一样,运行时的每一个层,包括原生进程层(Native Process)、寄宿层(Host)、托管入口点层(Managed Entry Point)以及应用程序寄宿层(Application Host),都是由依赖注入方式所解析的。(作为示例,KRuntime 能够通过Mono 运行在Linux 和OSX 操作系统上)。

ASP.NET vNext 代表了微软在 web 框架的构建及部署方面一次结构性的改变。

查看英文原文: ASP.NET vNext: Custom Project Loaders and Language Support

2014-09-08 00:091276
用户头像

发布了 428 篇内容, 共 172.2 次阅读, 收获喜欢 38 次。

关注

评论

发布
暂无评论
发现更多内容

一文回顾 Boundless Hackathon at Stanford 首期 Workshop

股市老人

Qcon 广州主题演讲:融云实时社区的海量消息分发实践

融云 RongCloud

通信 IM 社交 融云 Discord

ps 2023 v24.6beta激活版下载 支持AI功能

Rose

Photoshop 2023下载 PS测试版下载 FireflyAI

OS 生成文件目录树

Andy

在金融数据里挖呀挖,GaussDB开出了花

脑极体

数据库

Django笔记四十之运行Django环境的python脚本

Hunter熊

Python django 脚本

C语言编程-结构体

智趣匠

数组 函数参数 6 月 优质更文活动

启用Windows防火墙后,FTP传输非常慢

镭速

得物App万米高空WiFi拦截记

得物技术

App wifi 得物 拦截

一文回顾 Boundless Hackathon at Stanford 首期 Workshop

BlockChain先知

自媒体行业红利衰退,大部分自媒体作者将生存艰难

石头IT视角

Why Docker? Why not?

K

Docker 镜像 PaaS #云原生

2023 重新开始

HoneyMoose

Waves 14 Complete Mac激活最新版(Waves混音效果全套插件) v31.05.2023

真大的脸盆

Mac 软件 Waves 14破解教程 混音软件 混音套件 waves

WICC · 出海嘉年华倒计时!精彩不容错过,「指南」一手掌握

融云 RongCloud

社交 融云 泛娱乐 出海 wicc

嘉为蓝鲸荣登广东软件风云榜,获评新技术应用最受欢迎产品TOP10

嘉为蓝鲸

软件 新技术 应用程序

Java 致命错误: 在类路径或引导类路径中找不到程序包 java.lang

Andy

AI实战营第二期_OpenMMLab概述

IT蜗壳-Tango

OpenMMLab

一文回顾 Boundless Hackathon at Stanford 首期 Workshop

大瞿科技

Photoshop2023beta常见问题|ps 2023测试版智能AI功能不能用如何解决?

Rose

Photoshop2023beta FireflyAI

1 行代码开启「密钥检测」,给敏感数据加上防护锁

极狐GitLab

DevOps 安全 DevSecOps 安全左移 密钥检测

数字化转型应该如何去做?(技术篇)

数字随行

数字化转型

鲲鹏DevKit助力海通证券高效开发互联网行情系统,性能提升26%

说山水

模块二:微信朋友圈高性能复杂度

家有两宝

架构实战营 微信朋友圈高性能复杂度

又是供应链安全:GUAC项目0.1版释出

sender_is_sender

网络安全 开源软件 供应链安全 GUAC

Waves 14 Complete(Waves混音效果全套插件)安装激活教程

Rose

Waves 14破解教程 Waves 下载 Waves 14 最新版 Waves混音效果全套插件

Android File Transfer for mac(强大的安卓文件传输工具)

Rose

安卓文件传输工具 Android File Transfer Android和mac互通

小小机械臂 带动产业自动化

说山水

2023-06-01:讲一讲Redis常见数据结构以及使用场景。

福大大架构师每日一题

redis 福大大

鲲鹏DevKit助力通付盾Web应用防火墙产品开发,性能提升45%+

说山水

一文回顾 Boundless Hackathon at Stanford 首期 Workshop

EOSdreamer111

ASP.NET vNext允许你自定义项目加载器以及对多种语言的支持_C#_Roopesh Shenoy_InfoQ精选文章