文档章节

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

o
 osc_a22drz29
发布于 2019/03/21 15:26
字数 657
阅读 19
收藏 0

精选30+云产品,助力企业轻松上云!>>>

.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

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
NET Core 简介

前言 .NET发行至今已经过了十四个年头。随着版本的不断迭代更新,.NET在Windows平台上的表现也是越来越好,可以说Windows平台上所有的应用类型.NET几乎都能完成。 只是成也Windows,败也Win...

osc_n3166lwj
2018/07/08
3
0
托管ASP.NET Core应用程序到Windows服务中

  由于公司程序前置Nginx反向代理,所以在Windows中部署过程中没有采用IIS托管.Net Core应用,一直采用控制台dotnet命令直接运行。但是测试过程中,发现程序内Session一直无法覆盖,可是在...

osc_jd85vegy
2018/03/22
0
0
EntityFramework Core 学习扫盲

原文:EntityFramework Core 学习扫盲 0. 写在前面 本篇文章虽说是入门学习,但是也不会循规蹈矩地把EF1.0版本一直到现在即将到来的EF Core 2.0版本相关的所有历史和细节完完整整还原出来。在...

一条属于你的未来之路
05/24
0
0
Span<T>和ValueTuple<T>性能是.Net Core非常关键的特性

Span<T>和ValueTuple<T> 性能是.Net Core一个非常关键的特性,今天我们重点研究一下ValueTuple<T>和Span<T>. 一、方法的多个返回值的实现,看ValueTuple<T> 日常开发中,假如我们一个方法有多......

osc_igiogs8k
2019/04/15
2
0
Tomcat网站根目录与虚拟子目录配置

软件版本:apache-tomcat-8.0.35 配置根目录有三种方式: 第一种是修改server.xml文件中的Host节点 appBase="webapps" 属性.这里可以使用相对路径/绝对路径,相对路径是相对tomcat根目录下的路径...

lmxy1990
2016/09/08
464
0

没有更多内容

加载失败,请刷新页面

加载更多

Eclipse_JavaEE_Tomcat_MySQL环境配置

安装java环境,配置系统变量(JAVA_HOME,绝对路径) 下载eclipse+Tomcat+mysql window——》preference——》server——》runtime——》tomcat环境 项目右键build path 配mysql jar ,libra...

愿有时光可回首
今天
20
0
MySQL原理 - InnoDB引擎 - 行记录存储 - Redundant行格式

本文基于 MySQL 8 在上一篇:MySQL原理 - InnoDB引擎 - 行记录存储 - Compact格式 中,我们介绍了什么是 InnoDB 行记录存储以及 Compact 行格式,在这一篇中,我们继续介绍其他三种行格式。 ...

zhxhash
今天
29
0
leetcode面试题 17.13(恢复空格)--Java语言实现

求: 哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboo...

拓拔北海
今天
19
0
B站跨年晚会究竟做对了什么?

燃财经(ID:rancaijing)原创 作者 | 赵磊 编辑 | 周昶帆 “补课”是《bilibili晚会 二零一九最美的夜》这个视频中,观众在前两分钟刷得最多的弹幕,寓意着观众是在元旦之后回来补看跨年晚会...

子乾建建_Jeff
01/07
63
0
关于Scrapy爬虫项目运行和调试的小技巧(上篇)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 迟日江山丽,春风花草香。泥融飞燕子,沙暖睡鸳鸯。 扫除运行Scrapy爬虫程序...

yuhan336
04/02
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部