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

时间:2016-11-21 08:27:28

标签: .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;
}

以上代码调用Main()中的输入法hello.exe。我还可以使用mono_class_from_name加载类型,使用mono_object_new创建托管对象,使用mono_runtime_object_init初始化(调用构造函数)并使用mono_runtime_invoke调用其上的方法。< / p>

implementations

Code on gist上有详细记录。

我还没有深入研究mono doc,对内部实施一无所知。

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

  1. coreclr repo在.NET Foundation论坛上
  2. coreclr问题
  3. 某些coreclr主持人:
  4. 添加我试过在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
    

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

    我的问题如何在coreclr上执行此操作?

    更具体一点,coreclr中是否有任何函数,如coreclr_class_from_namecoreclr_object_newcoreclr_runtime_object_initcoreclr_runtime_invoke等等?如果有的话,他们会在某处记录吗?

0 个答案:

没有答案