承载(Host)通用语言运行时

承载(Host)通用语言运行时(CLR)

另一种使用COM 的方法是是把需要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起,开成自定义的承载通用语言运行时,通用语言运行时就是 C++ 应用程序,且有一些可用的库(.lib)文件,可以在标准的 C++ 应用程序中链接它。承载通用语言运行时的代码要比加载 COM 库的代码稍许复杂一点,但不需要复杂的注册 COM 库了;这个方法还可能以非常细粒度地控制通用语言运行时的行为,虽然,我们会发现默认的行为对于大多数情况已经非常好了;但是,这种方法并不适合高性能的在 C++ 和 F# 之间调用,因为,我们几乎不能控制使用的签名(signatures
used)[ 不知所云],通用语言运行时的方法调用是通过反射(reflection)完成的,这样,找到模块和方法是通过字符串的比较,因此,可能非常慢。然而,如果我们要调用 F# 代码中非常重要的部分,就会发现调用的成本很快冰被摊销了。

我们来看一下代码,它使用自定义的通用语言运行时承载,来调用一个 F# 的方法,代码是 Visual Studio C++ 项目。我们需要注意代码中的这些地方:

#include <mscoree.h> 告诉 C++ 编译器导入头文件,它包含了加载通用语言运行时的函数和接口;

然后,需要加载并初始化这个通用语言运行时,这是通过在结果对象上调用CorBindToRuntimeEx 加 Start 方法实现的;

通过调用ExecuteInDefaultAppDomain 方法在通用语言运行时程序集中执行方法。

下面是完整的 C++ 程序清单:

// !!! C++ Source !!!

#include "stdafx.h"

// the head file that exposes theC++ methods and interfaces

#include <mscoree.h>

// the applications main entry point

int _tmain(int argc, _TCHAR* argv[])

{

// pointer to the CLR host object

ICLRRuntimeHost*pClrHost = NULL;

// invoke the method that loads the CLR

HRESULT hrCorBind= CorBindToRuntimeEx(

NULL, // CLR version - NULL load the latest available

L"wks", // GCType ("wks" = workstation or "svr" = Server)

0,

CLSID_CLRRuntimeHost,

IID_ICLRRuntimeHost,

(PVOID*)&pClrHost);

// Start the CLR.

HRESULT hrStart =pClrHost->Start();

// Define the assembly, type, function to load,

// as well as the parameter and variable for the returnvalue

LPCWSTRpwzAssemblyPath = L"fslib.dll";

LPCWSTRpwzTypeName = L"Strangelights.TestModule";

LPCWSTRpwzMethodName = L"print";

LPCWSTRpwzMethodArgs = L"Hello world!";

DWORD retVal;

// Load an assembly and execute a method in it.

HRESULT hrExecute= pClrHost->ExecuteInDefaultAppDomain(

pwzAssemblyPath, pwzTypeName,

pwzMethodName,pwzMethodArgs,

&retVal);

// print the result

printf("retVal: %i", retVal);

}

除了这段代码以外,还需要链接mscoree.lib,这在Windows Platform SDK 中。我们需要知道的,也是唯一特殊的地方,是在 F# 这边的函数的签名必须是string -> int。这里的与 C++ 程序一起运行的 F# 函数非常简单:

module Strangelights.TestModule

// function will be invoked

let print s =

printfn "%s" s

0

示例的运行结果如下:

Hello world!

retVal: 0

注意

更多有关自定义通用语言承载的信息,参见 MSDN 上Alessandro Catorcini 和 Piotr Puszkiewicz 的文章:http://msdn.microsoft.com/en-us/magazine/cc163567.aspx

第十四章小结

在这一章,我们讨论了一些 F# 中用于兼容性和互操作的高级技术,虽然这些技术有些是绝对难以掌握,但它也会给 F# 编程增添了巨大的灵活性。

[

host,微软翻译成承载,网络上多数翻译成寄宿,托管。前面两个被动的成份更多一些,最后的主动成份更多一些,因此,译成托管更好。

]

[ 全文完 ]

承载(Host)通用语言运行时,布布扣,bubuko.com

时间: 2024-11-05 12:31:56

承载(Host)通用语言运行时的相关文章

类型与通用语言运行时:类型转换

CLR 最重要的一个特性就是类型安全.CLR 在运行时总能知道一个对象的类型.我们也可以用过调用 GetType方法来得到对象的准确类型.因为该方法是一个虚方法.所以我们不可能利用它来篡改一个类型的信息. 例如:我们不可能重写 Employee 类的 GetType方法使之返回一个SpaceShuttle类型. 作为开发人员,我们经常会遇到需要将一个对象转换为其他类型. CLR 允许我们将对象转换为其原来的类型或者它的任何一个基类型.各个编程语言自己决定如何提供这些转型操作. 例如,C# 不需要

类型与通用语言运行时:System.Object

CLR 要求每个类型最终都要继承自 System.Object 类型 1 //隐式继承 Object 2 class Employee { 3 ... 4 } 5 6 //显示继承继承 Object 7 class Employee : System.Object { 8 ... 9 } 类型定义(C#)描述 System.object 的公有方法 Equals:如果两个对象具有相同的值,方法返回 true GetHashCode:方法返回对象的值的散列码.如果一个对象被用作散列表的一个键值,那

承载(Host)通用语言执行时

承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ 应用程序,且有一些可用的库(.lib)文件.能够在标准的 C++ 应用程序中链接它. 承载通用语言执行时的代码要比载入 COM 库的代码稍许复杂一点,但不须要复杂的注冊 COM 库了:这种方法还可能以很细粒度地控制通用语言执行时的行为.尽管.我们会发现默认的行为对于大多数情况已经很好了:可是,这样的

在Win2008R2上安装vCenter6.7出现“系统上未安装通用C运行时。您可以从Microsoft网站上下载并安装”错误的解决办法

准备在一台Win2008R2虚拟机上安装vCenter 6.7,在安装时,弹出“系统上未安装通用C运行时.您可以从Microsoft网站上下载并安装”的错误提示,如下图所示. 进入微软官网“Windows中的Universal C Runtime更新”页面,针对自己的作品系统选择安装更新包. 操作系统更新 所有受支持的基于 x86 的 Windows 8.1 版本立即下载该程序包. 所有受支持的基于 x64 的 Windows 8.1 版本立即下载该程序包. 所有受支持的基于 x64 的 Win

运行时(iOS)

运行时(iOS) 一.什么是运行时(Runtime)? 运行时是苹果提供的纯C语言的开发库(运行时是一种非常牛逼.开发中经常用到的底层技术) 二.运行时的作用? 能获得某个类的所有成员变量 能获得某个类的所有属性 能获得某个类的所有方法 交换方法实现 能动态添加一个成员变量 能动态添加一个属性 能动态添加一个方法 三.案例:运行时获取成员变量名称 1.分析 #import <Foundation/Foundation.h> #import "XMGPerson.h" #im

Android运行时ART加载OAT文件的过程分析

在前面一文中,我们介绍了Android运行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容.这使得我们无需重新编译原有的APK就可以让它正常地在ART里面运行,也就是我们不需要改变原来的APK编程接口.本文我们通过OAT文件的加载过程分析OAT文件的结构,为后面分析ART的工作原理打基础. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! OAT文件

“迁移策略+新容器运行时”应对有状态应用的冷热迁移挑战

作者:稻农阿里云智能事业群高级技术专家参与主导容器运行时及网络创新工作:目前的工作侧重于基于进程虚拟化的研究及增强(网络及热迁移方面),在阿里推行微安全容器及热迁移等,力图在保持容器简单高资源利用率前提下,提供高安全及热迁移等增强功能 大家好,我的花名是稻农,首先我简单介绍一下我在这个领域的工作.在阿里,我们现在主要的侧重点是做大规模的运维和新的容器运行时.目前,大家可能已经对 Kubernetes 进行了广泛地使用,但多数还没有达到一定规模,有很多痛点以及内部的问题还没有得到充分暴露. 容器迁

公共语言运行时 CLR

公共语言运行时(Common Language Runtime,CLR)是处于.NET核心Framework的面向对象引擎,其将各种语言编译器生成的中间代码翻译为执行应用程序所需的原生码(Native Code). 由于CLR将所有代码转换成公共的交互式语言,之后被编译成原生码.所以,从原则而言,.NET可以在Unix.Linux.Mac OS X或其他操作系统上实现. CLR在Web服务器上执行程序.CLR激活对象,对它们进行安全检查,在内存中创建它们,执行它们,并且进行垃圾回收.

《转》.NET开源核心运行时,且行且珍惜

转载自infoQ 背景 InfoQ中文站此前报道过,2014年11月12日,ASP.NET之父.微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET 扩展为可在 Linux 和 Mac OS 平台上运行..NET核心运行时将基于MIT开源许可协议发布,其中将包括执行.NET代码所需的一切项目——CLR.JIT编译器.垃圾收集器(GC)和核心.NET基础类库.此外,微软还发布了Visual Stu