• 承载(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,微软翻译成承载,网络上多数翻译成寄宿,托管。前面两个被动的成份很多其它一些,最后的主动成份很多其它一些,因此。译成托管更好。

    ]

    [ 全文完 ]

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6828003.html
Copyright © 2020-2023  润新知