承载(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)通用语言执行时的更多相关文章

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

    CLR 要求每个类型最终都要继承自 System.Object 类型 //隐式继承 Object class Employee { ... } //显示继承继承 Object class Employ ...

  2. c#通用语言运行时CLR

  3. iOS 执行时

    一.什么是执行时(Runtime)? 执行时是苹果提供的纯C语言的开发库(执行时是开发中经经常使用到的底层技术) 二.执行时的作用? 能获得某个类的全部成员变量 能获得某个类的全部属性 能获得某个类的 ...

  4. Android执行时ART载入OAT文件的过程分析

    在前面一文中,我们介绍了Android执行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包括有从DEX文件翻译而来的本地机器指令.还包括有原来的DEX文件内容 ...

  5. net Core 2.1新功能Generic Host(通用主机)

    net Core 2.1新功能Generic Host(通用主机) http://doc.okbase.net/CoderAyu/archive/301859.html 什么是Generic Host ...

  6. 《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?

    <大话数据库>-SQL语句执行时,底层究竟做了什么小动作? 前言 大家好,我是Taoye,试图用玩世不恭过的态度对待生活的Coder. 现如今我们已然进入了大数据时代,无论是业内还是业外的 ...

  7. DDD理论学习系列(1)-- 通用语言

    1.引言 在开始之前,我想我们有必要先了解以下DDD的主要参与者.因为毕竟语言是人说的吗,就像我们面向对象编程一样,那通用语言面向的是? DDD的主要参与者:领域专家+开发人员 领域专家:精通业务的任 ...

  8. 【java】计算一段代码执行时长java.lang.System类里的public static long currentTimeMillis()方法

    public class Test_currentTimeMillis { public static void main(String[] args) { long start=System.cur ...

  9. DbCommandInterceptor抓取EF执行时的SQL语句

    EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我 ...

随机推荐

  1. maven依赖包下载失败解决办法

    原文:http://www    .zuidaima.com/question/2535347150441472.htm maven依赖包下载失败 比如:Missing artifact org.co ...

  2. 一张图解释RxJava中的线程控制

    如果调用链中包含多个subscribeOn和observeOn,会是什么情况? 这实际上是一个至关重要的问题,因为在任何情况下,我们都应该弄清楚我们写的每一行代码到底是运行在哪个线程上.这个问题绝对不 ...

  3. Google Xpath Helper

    下载方法: 1. 访问http://chrome-extension-downloader.com/ 2. 把https://chrome.google.com/webstore/detail/xpa ...

  4. 理解Hbase RowKey的字典排序;HBase Rowkey的散列与预分区设计

    HBase是三维有序存储的,是指rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度是依照ASCII码表排序的. HB ...

  5. 将ascll码转换成数值进行运算

    #include "stdlib.h"#include "stdio.h"int main() { char a[8] = { 49,32,33,61,62,6 ...

  6. log4j教程 10、PatternLayout

    如果想生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息. PatternLayout类扩展抽象 org.apache.log ...

  7. Python 把u'\xca\xd3\xc6\xb5\xd7\xa5\xc8\xa1' 输出正常中文

    今天碰见从数据库读取出来数据是u'\xca\xd3\xc6\xb5\xd7\xa5\xc8\xa1',输出显示乱码,经常查询处理如下: 两种方式: 1. s = u'\xca\xd3\xc6\xb5\ ...

  8. asp.net原理笔记----页面控件类型,页面状况和asp.net编译过程

    通过查看asp.net的整个生命周期之后 了解到在aspx的页面生命周期中 调用了BuildControlTree()方法生成页面控件树 之后再调用Rend()方法根据控件树生成html返回 aspx ...

  9. Django与SQL语言中——NULL与空字符串的区别

    SQL有指定空值的独特方式,它把空值叫做NULL. Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中, ...

  10. [LeetCode] Combinations——递归

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...