1. 程式人生 > >承載(Host)通用語言執行時

承載(Host)通用語言執行時

然而 導入 platform parameter eth obj 模塊 之間 兼容性

承載(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)通用語言執行時