Core CLR 自定义的Host官方推荐的一种形式(第一种)
时间:2019-03-21
本文章向大家介绍Core CLR 自定义的Host官方推荐的一种形式(第一种),主要包括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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Paxos 分布式必问的内容,没有之一
- Java进阶训练营 第一周JVM 预习笔记
- LeetCode905. 按奇偶排序数组 题解
- 试用 Azure Sql 数据库
- (九)整合spring cloud云服务架构 - commonservice-config配置服务搭建
- SessionStorage、LocalStorage详解
- 草率了,又一个Maven打包的问题
- MySQL案例:count(*)和count(1)的效率问题
- 监控、链路追踪、日志这三者有何区别?
- 预训练模型超全知识点梳理与面试必备高频FAQ
- 【论文投稿】SOTA论文也未必能被接收,谷歌科学家Eric Jang谈顶会审稿标准
- 【EMNLP2020】超越MLM,微软打造全新预训练任务
- snmp协议的相关资料
- Nodejs全栈入门-慕课网
- 产品工作基本流程