本地代码托管.NET8运行时
先决条件
- C++开发环境。
- dotnet8 SDK。
API
在.NET Core 3.0及更高版本中托管 .NET运行时是通过
nethost
和hostfxr
库的API完成的。 由这些入口点来处理查找和设置运行时进行初始化所遇到的复杂性;通过它们,还可启动托管应用程序和调用静态托管方法。
在.NET Core 3.0之前,托管运行时的唯一选项是通过
coreclrhost.h
API。 此托管API现已过时,不应用于托管.NET Core 3.0和更高版本的运行时。
- 头文件
#include <nethost.h>
#include <coreclr_delegates.h>
#include <hostfxr.h>
使用nethost.h
和hostfxr.h
创建主机
- 步骤 1 - 加载
hostfxr
并获取导出的托管函数
nethost
库提供用于查找hostfxr
库的get_hostfxr_path
函数。 hostfxr
库公开用于托管.NET 运行时的函数。 函数的完整列表可在hostfxr.h
和本机托管设计文档中找到。
示例和本教程使用以下函数:
hostfxr_initialize_for_runtime_config
:初始化主机上下文,并使用指定的运行时配置准备初始化 .NET 运行时。
hostfxr_get_runtime_delegate
:获取对运行时功能的委托。
hostfxr_close
:关闭主机上下文。
使用nethost
库中的get_hostfxr_path
API找到了hostfxr
库。 随后加载此库并检索其导出。
- 步骤 2 - 初始化和启动 .NET 运行时
hostfxr_initialize_for_runtime_config
和hostfxr_get_runtime_delegate
函数使用将加载的托管组件的运行时配置初始化并启动.NET运行时。 hostfxr_get_runtime_delegate
函数用于获取运行时委托,允许加载托管程序集并获取指向该程序集中的静态方法的函数指针。
- 步骤 3 - 获取函数指针的方法
方法1-加载托管程序集并获取指向托管方法的函数指针。调用示例中的load_assembly_and_get_function_pointer(...)
函数。
将调用运行时委托以加载托管程序集并获取指向托管方法的函数指针。委托需要程序集路径、类型名称和方法名称作为输入,并返回可用于调用托管方法的函数指针。
方法2-按程序集限定类名和函数名获取函数指针。调用get_function_pointer_fn
类的函数。
可以给每个CORECLR函数单独定义一个类型,也可以不单独定义类型。
auto test1 = rew_get_csharp_function<void (CORECLR_DELEGATE_CALLTYPE*)()>(L"WinFormsTest.Program, WinFormsTest", L"Test1");
- 步骤 4 - 运行托管代码!
本机主机现在可以调用托管方法,并向其传递所需的参数。
CPP
test1();
`
(END)