Документация по написанию хоста CoreCLR на c++

Я пишу хост CoreCLR на С++.

Я успешно вызвал функцию С# из С++: https://docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting

Чтение этой документации:

Другой вариант, если ExecuteAssembly не соответствует потребностям вашего хоста, — использовать CreateDelegate для создания указателя функции на статический управляемый метод. Это требует, чтобы хост знал сигнатуру метода, который он вызывает (чтобы создать тип указателя функции), но позволяет хостам гибко вызывать код, отличный от точки входа сборки.

учитывая функцию С#, как я могу "создать тип указателя функции С++"

например, для такой функции:

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

существуют ли какие-то правила маршалинга/демаршалинга, как вести себя с объектами или массивами в качестве параметров?

Есть ли достойная официальная документация для встраивания coreclr в код С++?

Я ищу что-то вроде этого (но для coreclr): http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html


person Albertino80    schedule 04.10.2017    source источник


Ответы (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);

Я создал класс в основной dll dotnet и смог вызвать его из 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);
        }

    }
}
person rawel    schedule 13.11.2017
comment
BSTR для строки, SAFEARRAY* для строки[]. - person Hans Passant; 13.11.2017
comment
В этом примере используется char*, почему @HansPassant говорит BSTR? Есть ли какие-то документы по этому поводу, или я должен перепроектировать образцы, чтобы понять? - person Albertino80; 24.11.2017