我正在用c ++编写CoreCLR主机。
我已经成功地从c ++中调用了一个c#函数: https://docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting
阅读该文件:
如果ExecuteAssembly无法满足您主人的需求,另一个选择是 使用CreateDelegate创建一个指向静态托管的函数指针 方法。这要求主机知道方法的签名 正在调用(为了创建函数指针类型)但是 允许主机灵活地调用除程序集之外的代码 切入点。
给定一个c#函数我怎样才能创建c ++函数指针类型"
例如,对于这样的函数:
public static int withParams(int aNumber, string[] args)
是否有一些编组/解组规则,如何将对象或数组作为参数?
在c ++代码中嵌入coreclr是否有适当的ufficial文档?
我寻找类似的东西(但对于coreclr): http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
答案 0 :(得分:1)
我认为该文档包含您需要的代码。
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:%x\n", 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);
}
}
}