如何在.netcore中嵌入coreclr创建托管对象并在本机C/C++中调用托管方法?

zwc*_*oud 7 .net mono .net-core

我之前在Mono上做过这个,我认为应该有一些方法可以用coreclr做同样的事情.

我在Mono上做了什么(在VS2013上编译并在win10上运行):

#include <windows.h>
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#pragma comment(lib, "mono-2.0.lib")

int main(int argc, char* argv[])
{
    mono_set_dirs("C:\\Program Files (x86)\\Mono\\lib",
        "C:\\Program Files (x86)\\Mono\\etc");

    MonoDomain *domain;
    domain = mono_jit_init(argv[0]);

    MonoAssembly *assembly;
    char* assemblyPath = "D:\\Mono\\hello.exe";
    assembly = mono_domain_assembly_open(domain, assemblyPath);
    if (!assembly)
        return 1;

    int returnValue = mono_jit_exec(domain, assembly, argc, argv);

    mono_jit_cleanup(domain);

    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码调用输入法Main()hello.exe.我也可以加载一个类型mono_class_from_name,创建一个托管对象mono_object_new,初始化(调用构造函数),mono_runtime_object_init并使用它调用方法mono_runtime_invoke.

关于要点的代码

所有这些都在mono doc上有详细记录.

我没有深入研究coreclr repo,对内部实现一无所知.

我已经通过互联网搜索并找到了一些可能有用的资源:

  1. 如何从Linux上的本机代码调用.Net核心库?在.NET基金会论坛上
  2. coreclr问题
  3. 一些coreclr主机:

添加我已尝试在dotnetcore的Windows版本上运行dumpbin.输出显示只有一些函数在coreclr.dll中导出.

ordinal hint RVA      name

      3    0 00018A30 GetCLRRuntimeHost
      4    1 00002030 GetMetaDataInternalInterface
      5    2 000021D0 GetMetaDataInternalInterfaceFromPublic
      6    3 000021E0 GetMetaDataPublicInterfaceFromInternal
      7    4 00001EA0 MetaDataGetDispenser
      8    5 00002EA0 coreclr_create_delegate
      9    6 00002FC0 coreclr_execute_assembly
     10    7 00002B80 coreclr_initialize
     11    8 00002DF0 coreclr_shutdown
      2    9 004D9E78 g_CLREngineMetrics
Run Code Online (Sandbox Code Playgroud)

所以我没能找到与.netcore中的coreclr做同样事情的方法.

我的问题是如何在coreclr上做到这一点?

更具体的,有什么功能coreclr像coreclr_class_from_name,coreclr_object_new,coreclr_runtime_object_init,coreclr_runtime_invoke等?如果有,他们是否在某处记录?