我之前在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>
Code on gist上有详细记录。
我还没有深入研究mono doc,对内部实施一无所知。
我已经在互联网上搜索并找到了一些可能有用的资源:
添加我试过在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_name
,coreclr_object_new
,coreclr_runtime_object_init
,coreclr_runtime_invoke
等等?如果有的话,他们会在某处记录吗?