承载(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 命名空间,此命名空间下的对象可以允许我 ...
随机推荐
- hdu1013(C++)
9的余数定理:一个数各位数字的总和除以9的余数与它本身除以9的余数同等 大数问题:防止大数,用字符串来存入数据,再转化为数字 #include<iostream>#include<s ...
- System.Runtime.InteropServices.COMException
System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for compo ...
- 学习一些和redux一样作用的mobx知识
两个组件:mobx和mobx-react 英文文档:https://mobx.js.org/refguide/object.html 中文文档:https://cn.mobx.js.org/ 样例:h ...
- 天地图应用ArcGIS发布的服务(转)
天地图应用ArcGIS发布的服务 本文包含三个部分:利用ArcMap将Excel的数据转化为ArcGIS MXD文件.利用ArcMap发布服务.天地图添加ArcGIS发布的服务. 一 MXD文件的生成 ...
- 【Hadoop】Hadoop DataNode节点超时时间设置
hadoop datanode节点超时时间设置 datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间 ...
- A read-only user or a user in a read-only database is not permitted to disable
A read-only user or a user in a read-only database is not permitted to disable 出现如题的问题通常是由于db.lck的所属 ...
- Angular 学习笔记——filter
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- CTAssetsPickerController 选中图片不显示对号的问题解决
转载自:http://blog.csdn.net/qq_27304667/article/details/53218547 早上AppStore审核通过,下载来看看.突然发现一个选择图片时候选中的标识 ...
- linux系统预留内存和磁盘大小
默认情况下, Linux 会最多使用 40% 的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的 IO 请求都是同步的. 将缓存写入磁盘时,有一个默认1 ...
- node - 关于package.json
2018-8-3(首次更新) 一.关于版本号: 文章来自:https://blog.csdn.net/yancloudfrontend/article/details/72867314 指定版本:比如 ...