承载(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# 函数很easy:
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)通用语言执行时的更多相关文章
- 类型与通用语言运行时:System.Object
CLR 要求每个类型最终都要继承自 System.Object 类型 //隐式继承 Object class Employee { ... } //显示继承继承 Object class Employ ...
- c#通用语言运行时CLR
- iOS 执行时
一.什么是执行时(Runtime)? 执行时是苹果提供的纯C语言的开发库(执行时是开发中经经常使用到的底层技术) 二.执行时的作用? 能获得某个类的全部成员变量 能获得某个类的全部属性 能获得某个类的 ...
- Android执行时ART载入OAT文件的过程分析
在前面一文中,我们介绍了Android执行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包括有从DEX文件翻译而来的本地机器指令.还包括有原来的DEX文件内容 ...
- net Core 2.1新功能Generic Host(通用主机)
net Core 2.1新功能Generic Host(通用主机) http://doc.okbase.net/CoderAyu/archive/301859.html 什么是Generic Host ...
- 《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?
<大话数据库>-SQL语句执行时,底层究竟做了什么小动作? 前言 大家好,我是Taoye,试图用玩世不恭过的态度对待生活的Coder. 现如今我们已然进入了大数据时代,无论是业内还是业外的 ...
- DDD理论学习系列(1)-- 通用语言
1.引言 在开始之前,我想我们有必要先了解以下DDD的主要参与者.因为毕竟语言是人说的吗,就像我们面向对象编程一样,那通用语言面向的是? DDD的主要参与者:领域专家+开发人员 领域专家:精通业务的任 ...
- 【java】计算一段代码执行时长java.lang.System类里的public static long currentTimeMillis()方法
public class Test_currentTimeMillis { public static void main(String[] args) { long start=System.cur ...
- DbCommandInterceptor抓取EF执行时的SQL语句
EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我 ...
随机推荐
- openfire源码研究笔记:对设计模式及原则的学习
原文:http://blog.csdn.net/jinzhencs/article/details/50522105 一.拦截器的实现 地点: package org.jivesoftware.o ...
- 设计模式之适配器模式(php实现)
/* github地址:https://github.com/ZQCard/design_pattern * 适配器模式:将一个类的接口转换成客户希望的另外一个接口. * 适配器模式使得原本由于接口不 ...
- ElasticSearch文档
1.什么是文档? 程序中大多的实体或对象能够被序列化为包含键值对的JSON对象,键(key)是字段(field)或属性(property)的名字,值(value)可以是字符串.数字.布尔类型.另一个对 ...
- hive 导入csv文件
创建hive表: create table table_name( id string, name string, age string ) row format serde 'org.apache. ...
- [PWA] Cache Third Party Resources from a CDN in a React PWA
Our service worker caches our static assets - but only those assets that are included in our React A ...
- 原来,多年以来,我一直是个curl/CRUD程序员
curl,就是create,update,remove,list的首字母简写.说是CRUD似乎更流行些,不过无所谓,知道是一个意思就好. curl程序员,就是增改删查程序员,中文说增删改查更加顺口. ...
- Linux vim命令记录
Ndd :删除N行 多行删除 :1,10d ctrl+v ,移动光标,ctrl+i,输入#,esc :移动处均会输入# gg:文档头 G:文档尾 o:下一行,并进入insert模式 O:上一行并输入 ...
- 01-2制作U盘启动盘--装机助理工具
在可以上网的电脑上执行制作启动盘的操作: 打开浏览器输入:http://www.zhuangjizhuli.com/upan.html 1.制作U盘启动盘: 2.下载 装机助理 软件 3.步骤: 第一 ...
- 使用itchat分析自己的微信(1)
1.准备工作 安装itchat pip install itchat参考 itchat内部函数 2.个人微信男女比例分析 ''' Have fun:itchat Author:杨 景 Time:201 ...
- 2d-Lidar 点云多直线拟合算法
具体步骤: EM+GMM(高斯模糊模型) 点云分割聚类算法的实现. 基于RANSAC单帧lidar数据直线拟合算法实现. 多帧lidar数据实时直线优化算法实现. 算法实现逻辑: Struct lin ...