自定义 .Net Core 主机运行.Net Core代码,以及控制运行时运行状态,是在.Net Core 高级运行环境以及定制.Net Host ,CLR 等必不可少的。
注意点:
1.必须以 x64形式 Debug程序,否则loadlibrary 运行之后为零
2.所有的路径都必须放在(Product\Windows_NT.x64.Debug)下面,因为程序要加载默认DLL,缺少DLL将不能运行
这些设置包括为
1.设置启动标志
使用服务器GC( STARTUP_SERVER_GC), 还是使用并发GC(STARTUP_CONCURRENT_GC), STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN 最大化域中性加载 STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST 强名称程序集的域中立加载,STARTUP_SINGLE_APPDOMAIN 所有代码都在默认的AppDomain中执行,STARTUP_SINGLE_APPDOMAIN 所有代码都在默认的AppDomain中执行。
2.以及设置AppDomain的运行方式
APPDOMAIN_FORCE_TRIVIAL_WAIT_OPERATIONS 在等待期间不要抽取信息,
APPDOMAIN_SECURITY_SANDBOXED 导致不从TPA列表中的程序集作为部分受信任加载,
APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS 启用特定于平台的程序集,
APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP 允许从非TPA程序集进行PInvoking,
APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT完全禁用透明度检查。
1.利用LoadLibrary 加载CoreClr.DLL获取句柄
HMODULE ret = LoadLibraryExW(coreDllPath, NULL, 0);
2.获取DLL里面的GetCLRRuntimeHost函数,通过这个函数找到IID_ICLRRuntimeHost4接口(宿主接口)
ICLRRuntimeHost4* runtimeHost;
FnGetCLRRuntimeHost pfnGetCLRRuntimeHost = (FnGetCLRRuntimeHost)::GetProcAddress(coreCLRModule, "GetCLRRuntimeHost");
if (!pfnGetCLRRuntimeHost) { printf("ERROR - GetCLRRuntimeHost not found"); return -1; }
HRESULT hr = pfnGetCLRRuntimeHost(IID_ICLRRuntimeHost4, (IUnknown**)&runtimeHost);
3.设置启动标志
hr = runtimeHost->SetStartupFlags(
static_cast<STARTUP_FLAGS>(
STARTUP_FLAGS::STARTUP_CONCURRENT_GC | STARTUP_FLAGS::STARTUP_SINGLE_APPDOMAIN | STARTUP_FLAGS::STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN ) );
4.启动Host
hr = runtimeHost->Start();
5.设置AppDomain
int appDomainFlags =
APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS |
APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP |
APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT;
6.创建AppDomain
hr = runtimeHost->CreateAppDomainWithManager( L"Sample Host AppDomain", appDomainFlags, NULL,NULL, sizeof(propertyKeys) , propertyKeys, propertyValues, &domainId);
7.运行托管代码
DWORD exitCode = -1; hr = runtimeHost->ExecuteAssembly(domainId, targetApp, argc - 1, (LPCWSTR*)(argc > 1 ? &argv[1] : NULL), &exitCode);
以上简短几行代码就可以构建一个本机Host(Java/.Net QQ群:676817308)
第二种方法,直接上代码:
// ConsoleApplication15.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include<Windows.h>
#include "coreclrhost.h"
void BuildTpaList(const char* directory, const char* extension, std::string& tpaList);
typedef char* doWork_ptr(char *argv);
doWork_ptr managedDelegate;
int main()
{
coreclr_initialize_ptr initializeCoreClr = (coreclr_initialize_ptr)GetProcAddress(coreClr, "coreclr_initialize");
coreclr_create_delegate_ptr createManagedDelegate = (coreclr_create_delegate_ptr)GetProcAddress(coreClr, "coreclr_create_delegate");
coreclr_shutdown_ptr shutdownCoreClr = (coreclr_shutdown_ptr)GetProcAddress(coreClr, "coreclr_shutdown");
coreclr_execute_assembly_ptr executeAssembly = (coreclr_execute_assembly_ptr)GetProcAddress(coreClr, "coreclr_execute_assembly");
std::string tpaList;
BuildTpaList(runtimePath, ".dll", tpaList);
const char* propertyKeys[] = {
"TRUSTED_PLATFORM_ASSEMBLIES" // Trusted assemblies
};
const char* p