编写自定义 .NET Core 主机以从本机代码控制 .NET 运行时

本文介绍了如何编写自定义.NET Core主机,以便从本机代码控制.NET运行时,包括加载CoreClr.DLL,设置启动标志,启动Host,创建AppDomain,并执行托管代码。强调了必须在x64模式下Debug程序,并提供了关键代码示例。
摘要由CSDN通过智能技术生成

自定义 .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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值