Core CLR 自定义的Host官方推荐的一种形式(第一种)

.Net Core CLR提供两种Host API访问 托管代码的形式,按照微软官方的说法,一种是通过CoreClr.DLL来直接调用托管生成的DLL程序集,另外一种是通过CoreClr里面的C导出函数GetCLRRuntimeHost获取到IID_ICLRRuntimeHost4然后访问托管代码。

其实这两种形式可以合二为一,第一种更简单,更方便的控制托管代码。第二种更灵活些,在一些老旧的主机上会用到这些代码,实际上第一种形式是扩充了第二种访问形式,进行了一个整体封装,原理上其实还是一样的。

实际上这两种形式的实现都可以,作为自定义CLR Host进行定制自己一些业务上或者需求上的作业。

假如说,你要自己定制Core CLR Host ,name这两种方式是最好的选择,也是微提供表层API的实现形式

第二种形式实现: 在上一篇博客中,地址:https://www.cnblogs.com/tangyanzhi1111/p/10524451.html

第一种形式如下实现:

  1 #include "stdafx.h"
  2
  3 dataSize, double* data, report_callback_ptr callbackFunction);
  4 void BuildTpaList(const char* directory, const char* extension, std::string& tpaList);
  5
  6 typedef void (STDMETHODCALLTYPE MainMethodFp)(LPWSTR* args);
  7
  8 typedef char*(*doWork_ptr)(char* abc);
  9 int main(int argc, char* argv[])
 10 {
 11     HMODULE coreClr = LoadLibraryExA((LPCSTR)("coreclr.dll"), NULL, 0);
 12
 13     coreclr_initialize_ptr initializeCoreClr = (coreclr_initialize_ptr)GetProcAddress(coreClr, "coreclr_initialize");
 14     coreclr_create_delegate_ptr createManagedDelegate = (coreclr_create_delegate_ptr)GetProcAddress(coreClr, "coreclr_create_delegate");
 15     coreclr_shutdown_ptr shutdownCoreClr = (coreclr_shutdown_ptr)GetProcAddress(coreClr, "coreclr_shutdown");
 16     coreclr_execute_assembly_ptr executeAssembly = (coreclr_execute_assembly_ptr)GetProcAddress(coreClr, "coreclr_execute_assembly");
 17     std::string tpaList;
 18
 19     BuildTpaList(runtimePath, ".dll", tpaList);
 20     const char* propertyKeys[] = {
 21         "TRUSTED_PLATFORM_ASSEMBLIES"      // Trusted assemblies
 22     };
 23
 24     const char* propertyValues[] = {
 25         tpaList.c_str()
 26     };
 27
 28     void* hostHandle;
 29     unsigned int domainId;
 30
 31     int hr = initializeCoreClr(
 32         runtimePath,        // App base path
 33         "SampleHost",       // AppDomain friendly name
 34         sizeof(propertyKeys) / sizeof(char*),   // Property count
 35         propertyKeys,       // Property names
 36         propertyValues,     // Property values
 37         &hostHandle,        // Host handle
 38         &domainId);         // AppDomain ID
 39
 40     doWork_ptr managedDelegate;
 41     hr = createManagedDelegate(
 42         hostHandle,
 43         domainId,
 44         "Main, Version=1.0.0.0",
 45         "Main.Program",
 46         "Main",
 47         (void**)&managedDelegate);
 48
 49     ((MainMethodFp*)managedDelegate)(NULL);
 50     double data[4];
 51     data[0] = 0;
 52     data[1] = 0.25;
 53     data[2] = 0.5;
 54     data[3] = 0.75;
 55
 56     // Invoke the managed delegate and write the returned string to the console
 57     //char* ret = managedDelegate("Test job", 5, sizeof(data) / sizeof(double), data, ReportProgressCallback);
 58
 59     //printf("Managed code returned: %s\n", ret);
 60
 61     //CoTaskMemFree(ret);
 62
 63     hr = shutdownCoreClr(hostHandle, domainId);
 64
 65     if (!FreeLibrary(coreClr))
 66     {
 67         printf("Failed to free coreclr.dll\n");
 68     }
 69     return 0;
 70 }
 71
 72
 73 void BuildTpaList(const char* directory, const char* extension, std::string& tpaList)
 74 {
 75
 76     std::string searchPath(directory);
 77     searchPath.append("\\");
 78     searchPath.append("*");
 79     searchPath.append(extension);
 80
 81     WIN32_FIND_DATAA findData;
 82     HANDLE fileHandle = FindFirstFileA(searchPath.c_str(), &findData);
 83
 84     if (fileHandle != INVALID_HANDLE_VALUE)
 85     {
 86         do
 87         {
 88             tpaList.append(directory);
 89             tpaList.append("\\");
 90             tpaList.append(findData.cFileName);
 91             tpaList.append(";");
 92
 93         } while (FindNextFileA(fileHandle, &findData));
 94         FindClose(fileHandle);
 95     }
 96 }
 97
 98
 99
100 int ReportProgressCallback(int progress)
101 {
102     printf("Received status from managed code: %d\n", progress);
103     return -progress;
104 }

Java/.Net讨论群:676817308

原文地址:https://www.cnblogs.com/tangyanzhi1111/p/10571966.html

时间: 2024-10-10 08:07:27

Core CLR 自定义的Host官方推荐的一种形式(第一种)的相关文章

使用.NET Core创建Windows服务(一) - 使用官方推荐方式

原文:Creating Windows Services In .NET Core – Part 1 – The "Microsoft" Way 作者:Dotnet Core Tutorials 译者:Lamond Lu 译文:使用.NET Core创建Windows服务(一) - 使用官方推荐方式 创建Windows服务来运行批处理任务或者运行后台任务,是一种非常常见的模式,但是由于云服务(Amazon Lambda, Azure WebJobs以及Azure Functions)的

Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html 限于篇幅的原因,在上篇文章中我们只学习了ActionBar基础部分的知识,那么本篇文章我们将接着上一章的内容继续学习,探究一下ActionBar

IOS7官方推荐图标和图像尺寸

图标和图像大小 每一个应用程序需要一个应用程序图标和启动图像.此外,一些应用程序需要自定义的图标来表示特定于应用程序的内容,功能,或在导航栏,工具栏和标签栏模式. 不像其他的定制艺术品在您的应用程序的图标和图像,表38-1列出必须满足特定的标准,因此,IOS可以正确显示.此外,一些图标和图像文件的命名要求.(如果你需要支持标准分辨率的iPhone或iPod touch设备,除以2下面列出高分辨率的大小.) 表38-1自定义图标和图像尺寸(像素) 描述 iPhone 5和iPod touch的尺寸

Redis集群官方推荐方案 Redis-Cluster

Redis-Cluster redis使用中遇到的瓶颈 我们日常在对于redis的使用中,经常会遇到一些问题 1.高可用问题,如何保证redis的持续高可用性. 2.容量问题,单实例redis内存无法无限扩充,达到32G后就进入了64位世界,性能下降. 3.并发性能问题,redis号称单实例10万并发,但也是有尽头的. redis-cluster的优势 1.官方推荐,毋庸置疑. 2.去中心化,集群最大可增加1000个节点,性能随节点增加而线性扩展. 3.管理方便,后续可自行增加或摘除节点,移动分

转帖:Android 官方推荐 : DialogFragment 创建对话框

转: Android 官方推荐 : DialogFragment 创建对话框 复制内容,留作备份 1. 概述 DialogFragment在android 3.0时被引入.是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框.典型的用于:展示警告框,输入框,确认框等等.在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog.注:官方不推荐直接使用Dialog创建对话框. 2. 好处与用法 使用DialogFragment

iTOP-6818开发板支持AXP228电源管理[官方推荐最佳匹配]_支持动态调频

iTOP-6818开发板与4418开发板共兼容同一底板: 核心板:::::: 尺寸 50mm*60mm 高度 核心板连接器组合高度1.5mm PCB层数 6层PCB沉金设计 4418 CPU ARM Cortex-A9 四核 S5P4418处理器 1.4GHz 6818 CPU ARM Cortex-A53 八核 S5P6818处理器 1.4GHz 内存 1GB DDR3(2GB可选) 存储 16GB EMMC 电源管理 AXP228(官方推荐最佳匹配),支持动态调频,超低功耗 工作电压 直流5

Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用

【转】Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用

WordPress官方推荐的代码高亮插件

今天花了大半天的时间,终于选择好自己心仪的wordpress代码高亮插件,同时它也是wordpress官方推荐的代码语法高亮插件.在选择的过程中,我对比和试用了若干个代码高亮wordpress插件,包括有国人开发的wp-codebox.codecolorer.wp-syntax等,但这些插件不是很久没有更新和最新的wordpress不兼容导致安装不上,就是功能无法满足我的要求.直到我在wordpress官方网站支持文档里看到了我要的效果,以及在文章最后找到了wordpress推荐的代码高亮插件.