承载(Host)通用语言运行时
来源:互联网 发布:淘宝 单行本 小椋ムク 编辑:程序博客网 时间:2024/05/16 14:21
承载(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)通用语言运行时
- 通用语言运行时
- 承载.NET公共语言运行库
- 承载.NET公共语言运行库
- (读书笔记).NET大局观—通用语言运行时
- (四)类型与通用语言运行时
- 如何加载通用语言运行时?
- 编写执行你的第一个Yukon CLR(通用语言运行时)存储过程
- 编写执行你的第一个YukonCLR(通用语言运行时)存储过程
- vc++ 调用(.Net)通用语言运行库
- (3)承载和运行基本的 wcf 服务
- WCF入门教程(四)通过Host代码方式来承载服务
- 第二部分 类型与通用语言运行时----------------读《Microsoft.NET框架程序设计》
- 第二部分 类型与通用语言运行时----读《Microsoft.NET框架程序设计》
- 第二部分 类型与通用语言运行时2-----《Microsoft.NET框架程序设计》
- CUDA学习之五(通用运行时组件)
- CLR(common language runtime)通用语言运行平台
- 通用扩展语言(GEL)
- 写给准备参加秋招的学弟学妹们~一定要来看哦~
- IOS开发的哪些异常之异常断点
- 《Advanced Windows Debugging》学习笔记
- git 初级使用记录
- Nginx Proxy Cache分析
- 承载(Host)通用语言运行时
- 编写高效的C++程序方法之使用对象池
- LeetCode刷题笔录 Pascal's Triangle
- 软件开发是瓜熟蒂落,不能强迫
- 山东理工ACM【2554】冒泡排序中数据交换的次数
- JAVA文件上传工具类
- 两相异正数的等差中项和等比中项
- 安卓webview和js+html交互利用的addJavascriptInterface和webview.loadUrl("javascript:**");
- Tomcat 官网下载地址