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

时间:2017-10-04 21:09:49

标签: c# c++ coreclr

我正在用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

1 个答案:

答案 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);
        }

    }
}