Я пишу хост CoreCLR в C ++.
Я успешно вызвал функцию 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)
Существуют ли правила маршалинга / демаршалинга, как мне вести себя с объектами или массивами в качестве параметров?
Есть ли приличная полезная документация для встраивания coreclr в код на c ++?
Я ищу что-то вроде этого (но для 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);
Я создал класс в dll-ядре 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);
}
}
}
Других решений пока нет …