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

    ]

    [ 全文完 ]

  • 相关阅读:
    Java多线程(二) synchronized 针对对象进行锁定
    微信公众号 openId获取
    Java多线程(一) Thread和 Runnable
    设计模式
    vue城市选择组件
    分享几个简单的技巧让你的 vue.js 代码更优雅
    手把手教你vue配置请求本地json数据
    详解vue全局组件与局部组件使用方法
    细说vue axios登录请求拦截器
    在Vue项目中加载krpano全景图
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6828003.html
Copyright © 2020-2023  润新知