关于用c++编写CoreCLR主机的文档

Documentation about writing a CoreCLR host in c++

本文关键字:主机 文档 CoreCLR 编写 于用 c++      更新时间:2023-10-16

我正在用c++编写一个CoreCLR主机。

我已经成功地从c++中调用了一个c#函数:https://learn.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting

阅读文档:

如果ExecuteAssembly不能满足主机的需求,则另一个选项是使用CreateDelegate创建指向静态托管的函数指针方法这需要主机知道它的方法的签名正在调用(以便创建函数指针类型),但是允许宿主灵活地调用程序集以外的代码入口点。

给定一个c#函数,我如何"创建c++函数指针类型">

例如,对于这样的函数:

public static int withParams(int aNumber, string[] args)

是否有一些封送处理/取消封送处理规则,如何将对象或数组作为参数?

在c++代码中嵌入coreclr是否有合适的正式文档?

我在找这样的东西(但对于coreclr):http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

我认为文档中包含了您需要的代码。

void *pfnDelegate = NULL;
hr = runtimeHost->CreateDelegate(
domainId,
L"HW, Version=1.0.0.0, Culture=neutral",  // Target managed assembly
L"ConsoleApplication.Program",            // Target managed type
L"Main",                                  // Target entry point (static method)
(INT_PTR*)&pfnDelegate);
((MainMethodFp*)pfnDelegate)(NULL);

我在dotnet核心dll中创建了一个类,并能够从cpp调用它,如下所示。

void *pfnDelegate = NULL;
hr = runtimeHost->CreateDelegate(
domainId,
L"SampleAppCore",  // Target managed assembly
L"SampleAppCore.Start", // Target managed type
L"Run",                 // Target entry point (static method)
(INT_PTR*)&pfnDelegate);
if (FAILED(hr))
{
printf("ERROR - Failed to execute %s.nError code:%xn", targetApp, hr);
return -1;
}

char* hello = "hello ";
((MainMethodFp*)pfnDelegate)(hello);

代表的格式

typedef void (STDMETHODCALLTYPE MainMethodFp)(char* args);

核心类

using System;
namespace SampleAppCore
{
public static class Start{
public static void Run(string input){
Console.WriteLine(input);
}
}
}